DeepSeek Harness: instalación de plugins y orden de carga de configuración

El capítulo anterior creó el bundle hello-plugin; este artículo lo instala en un profile.

Los pasos de instalación se realizan sobre la base deDeepSeek Harness: bundle y profile: dos manifestspuedes revisar primero los dos manifests de ese capítulo.

En este capítulo responderemos también una pregunta clave: cuando las configuraciones de múltiples bundles se superponen, ¿quién cubre a quién?

Esto lo determina el orden de carga de la configuración efectiva.


Orden de carga: capas de la configuración efectiva

La configuración efectiva se combina capa por capa en un orden fijo sobre una raíz vacía; la capa aplicada después gana por línea.

配置加载顺序层次图

El orden completo es el siguiente.

OrdencapaDescripción
1Del profiledsh.profile.bundlesListaEl patch de cada bundle sigue el orden de la lista: primero dsh-base, luego cada bundle instalado en el orden en que fue agregado.
2El propio profilecordis.patch.ymlCapa de patch a nivel de profile de usuario
3A nivel de home$DSH_HOME/cordis.patch.ymlPreferencias locales de la máquina compartidas por todos los profiles.
4Cada--patch <path> overlayen orden de argv

Los argumentos de la aplicación no son otra capa de patch.

Los bundles de la capa superficial pueden resolverlos mediante los servicios propios de la aplicación normal.

La capa aplicada después gana por línea, y el patch reemplaza todo el valor de config de la línea objetivo, en lugar de fusionar en profundidad las claves.


Manos a la obra: instalar hello-plugin en el profile

dsh plugin --profile <name> <args...>Se reenvía a pnpm dentro del directorio del profile, por lo que todos los subcomandos de pnpm están disponibles.

En el directorio que contiene hello-plugin, instala el checkout de ese paquete.

dsh plugin --profile demo add ./hello-plugin

El primer uso inicializará el profile.

@deepseek-ai/dsh-baseSe convertirá en su primer bundle.

pnpm enlaza ese checkout, y dsh, porque este paquete declaradsh.bundle, lo añade adsh.profile.bundles。

El package.json del profile generado es aproximadamente el siguiente.

Ejemplo

{
  "name": "dsh-profile-demo",
  "private": true,
  "dependencies": {
    "dsh-hello-plugin": "link:/path/to/hello-plugin"
  },
  "dsh": {
    "profile": {
      "bundles": [
        "@deepseek-ai/dsh-base",
        "dsh-hello-plugin"
      ]
    }
  }
}

El significado de cada campo es el siguiente.

CampoDescripción
nameEl nombre del paquete del profile, con la formadsh-profile-demo
privateEl profile solo se usa en esta máquina, no se publica.
dependenciesDependencia de plugin fuera del árbol, enlazada por pnpm al checkout local.
dsh.profile.bundlesLista ordenada de bundles; el orden de carga es el orden del arreglo aquí.

Primero no lo ejecutes, solo valida esa capa, y luego ejecútalo.

dsh --profile demo --dump-config   # 会显示一个 "# == dsh-hello-plugin" 层
dsh --profile demo

--dump-configImprimirá la configuración efectiva superpuesta para verificar de qué bundle proviene cada capa.

En la salida deberías poder ver# == dsh-hello-pluginmarcas de capa de este tipo.

Eliminar el plugin es igual de sencillo.

dsh plugin --profile demo remove dsh-hello-plugin   # 同时移除依赖和对应的层

El patch reemplaza la línea completa por id

El patch no es una fusión en profundidad, sino queidreemplaza por línea completa todo el valor de config de la línea objetivo.

Esto tiene dos implicaciones para los autores de bundles.

Método de fusiónComportamientoLa elección de dsh
Fusión en profundidadSolo sobrescribe las claves modificadas; las demás se conservan automáticamente.No es así
Reemplazo de la línea completaReemplaza el valor de config de la línea completa por id; debes reafirmar todas las claves.dsh adopta

Primero, tu patch puede sobrescribir por id las líneas de las capas anteriores.

Igual quedsh-web-appel bundle sobrescribedsh-baselas líneas de esa manera.

Pero debes reafirmar cada clave que necesite esa línea, no solo escribir la que cambia.

Segundo, el usuario puede, en su propio profile,cordis.patch.ymlsobrescribir tus líneas sin necesidad de modificar tu bundle.

Por lo tanto, proporciona primero los valores predeterminados de configuración que el usuario probablemente conservará; el resto lo asume el schema.

Los nombres de los bundles integrados siempre se resuelven desde el propio directorio de instalación de dsh.

pnpm solo gestiona paquetes fuera del árbol, por lo que tu bundle puede depender con confianza de@deepseek-ai/dsh-baseque exista y sea consistente con la instalación.


Resumen y autoevaluación

Instalar un plugin consiste en añadir a la lista de bundles del profile un paquete que declaradsh.bundledicho paquete; la configuración efectiva se superpone por capas en el orden bundles → profile patch → home patch → --patch overlay.

Preguntas de autoevaluación:

  1. ¿Cuál es el orden de carga de las cuatro capas de la configuración efectiva?
  2. Cuando un patch sobrescribe por id, ¿por qué es necesario reafirmar todas las claves?
  3. dsh --profile demo --dump-config¿Cuál es la función de ...?
Otras extensiones