DeepSeek Harness プラグインのインストールと設定の読み込み順序

前の章で hello-plugin バンドルを作成しました。この記事ではそれを profile にインストールします。

インストール手順はDeepSeek Harness のバンドル bundle と profile:2つのマニフェストに基づいて進めます。先にその記事の2つのマニフェストを確認しておいてください。

この章では、もう1つの重要な質問にも同時に答えます:複数のバンドルの設定が重なる場合、結局どちらがどちらを上書きするのか。

これは有効設定の読み込み順序によって決まります。


読み込み順序:有効設定のレイヤー

有効設定は空のルートの上に固定順序でレイヤーごとに合成され、後から適用されるレイヤーが行単位で優先されます。

配置加载顺序层次图

完全な順序は以下の通りです。

順序层説明
1profile のdsh.profile.bundlesリスト各バンドルの patch はリスト順に適用され、最初に dsh-base、次にインストール済みの各バンドルが追加順に適用されます
2profile 自身のcordis.patch.ymlユーザー profile レベルの patch レイヤー
3home レベルの$DSH_HOME/cordis.patch.yml各 profile が共有するマシンローカルの環境設定
4各--patch <path> overlayargv 順

アプリケーション引数は別の patch レイヤーではありません。

表層のバンドルは通常のアプリケーション独自のサービスを介してそれらを解決できます。

後から適用されるレイヤーが行単位で優先され、patch は対象行の config 値全体を置換します。各キーをディープマージするのではありません。


実践:hello-plugin を profile にインストールする

dsh plugin --profile <name> <args...>profile ディレクトリ内で pnpm に転送されるため、すべての pnpm サブコマンドが利用できます。

hello-plugin を含むディレクトリ内で、そのパッケージの checkout をインストールします。

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

初回使用時に profile が初期化されます。

@deepseek-ai/dsh-baseそれが最初のバンドルになります。

pnpm がその checkout をリンクし、dsh はこのパッケージがdsh.bundleを宣言しているため、それをdsh.profile.bundles。

に追加します。生成された profile の package.json はおおよそ次のようになります。

実例

{
  "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"
      ]
    }
  }
}

各フィールドの意味は以下の通りです。

フィールド説明
nameprofile のパッケージ名。形式はdsh-profile-demo
privateprofile はこのマシンでのみ使用され、公開されません
dependenciesツリー外のプラグイン依存関係で、pnpm によってローカルの checkout にリンクされます
dsh.profile.bundles順序付きバンドルリストで、読み込み順序はこの配列の順序です

まず起動せずにそのレイヤーだけを検証し、その後起動します。

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

--dump-config合成後の有効設定が出力されるので、各レイヤーがどのバンドル由来かを確認できます。

出力には次のような# == dsh-hello-pluginレイヤーマーカーが表示されるはずです。

プラグインの削除も同様に簡単です。

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

patch は id ごとに行全体を置換

patch はディープマージではなく、idに従って対象行の config 値全体を行ごと置換します。

これにより、バンドル作者には2つの帰結が生じます。

マージ方式動作dsh の採用
ディープマージ変更したキーのみ上書きし、他のキーは自動的に保持されるそうではない
行全体の置換id ごとに config 値を行全体で置換し、すべてのキーを再指定する必要があるdsh が採用するのは

第一に、あなたの patch は id によって前の各レイヤーの行を上書きできます。

あたかもdsh-web-appバンドルがdsh-baseの行を上書きするのと同じです。

ただし、変更したキーだけを書くのではなく、その行に必要なすべてのキーを再指定しなければなりません。

第二に、ユーザーは自分の profile のcordis.patch.yml内であなたの行を上書きでき、あなたのパッケージを変更する必要はありません。

したがって、ユーザーが高い確率で保持するであろう設定のデフォルト値を優先的に提供し、残りは schema に任せます。

組み込みバンドル名は常に dsh のインストールディレクトリ自体から解決されます。

pnpm はツリー外のパッケージのみを管理するため、あなたのバンドルは安心して@deepseek-ai/dsh-baseの存在とインストールとの一貫性に依存できます。


まとめと自己テスト

プラグインのインストールとは、profile の bundles リストにdsh.bundleを宣言したパッケージを追加することです。有効設定は bundles → profile patch → home patch → --patch overlay の順にレイヤーごとに重ねられます。

自己テスト問題:

  1. 有効設定の4つのレイヤーの読み込み順序は何ですか?
  2. patch が id で上書きするとき、なぜすべてのキーを再指定する必要があるのですか?
  3. dsh --profile demo --dump-configの役割は何ですか?
他の拡張