DeepSeek Harness Kombinations-Bundle und Profil: zwei Manifeste
In den vorherigen Kapiteln haben wir--patchverwendet; das Overlay lädt lokale Plugins; ab diesem Artikel verpacken wir sie in installierbare Bundles.
In diesem Abschnitt klären wir die beiden grundlegendsten Konzepte:bundleundprofile, sowie ihre jeweiligen Manifeste.
Zwei Konzepte, zwei Arten von Manifesten
Der Installationsmechanismus basiert auf zwei Konzepten, die beide durch eine einzige package.json beschrieben werden.
Sie liegen indsh. Die Art des unter dem Schlüssel mitgeführten Manifests unterscheidet sich, und ebenso die Fragen, die es beantwortet.
Ein Bundle ist ein npm-Paket mit einer angehängten Konfigurationsschicht.
Sein Manifest deklariertdsh.bundle, beantwortet "was dieses Paket beiträgt": eine Patch-Datei, die Plugin-Zeilen einfügt oder überschreibt.
profile befindet sich unter$DSH_HOME/profiles/<name>und beschreibt ein Verzeichnis eines bootfähigen Bundles.
Sein Manifest deklariertdsh.profile, beantwortet "welche Bundles diese Konfiguration bilden und in welcher Reihenfolge".
Bundleist etwas, das man schreibt und verteilt;Profilwird vom Benutzer verwendet
dsh --profile <name>das, was gebootet werden soll.Nichts ist beides gleichzeitig.
| Konzepte | Manifest-Schlüssel | Beantwortete Fragen | Wer schreibt / wer verwendet |
|---|---|---|---|
| Bundle (Kombinationspaket) | dsh.bundle | Was dieses Paket beiträgt (eine Patch-Datei) | Vom Plugin-Autor geschrieben, mit dem Paket verteilt |
| Profil | dsh.profile | Welche Bundles diese Konfiguration bilden und in welcher Reihenfolge | vondsh pluginAutomatisch erstellt und verwaltet, vom Benutzer gestartet |
Das Profil befindet sich außerhalb des Installationsverzeichnisses; die Pfadvorlage ist$DSH_HOME/profiles/<name>。
Praxis: Das Verbundpaket hello-plugin erstellen
Laut dem offiziellen Tutorial zuerst das Paketverzeichnis erstellen.
Beispiel
mkdir -p hello-plugin
Die Verzeichnisstruktur des Bundles sieht wie folgt aus, mit insgesamt drei Dateien.
Beispiel
hello-plugin/ ├── package.json # 声明 dsh.bundle ├── cordis.patch.yml # profile 列出该 bundle 时应用的配置层 └── index.js # patch 行引用的插件模块
Erstellen Siehello-plugin/package.jsonund deklarieren Sie das Manifest des Verbundpakets.
Beispiel
"name": "dsh-hello-plugin",
"version": "0.1.0",
"type": "module",
"main": "index.js",
"files": ["index.js", "cordis.patch.yml"],
"dsh": { "bundle": { "patch": "./cordis.patch.yml" } }
}
Die Bedeutungen der Felder in package.json sind wie folgt.
| Fields | Beschreibung |
|---|---|
name | Paketname; die Node-Modulauflösung verwendet ihn, um installierten Code zu finden |
version | Versionsnummer |
type | "module"Gibt an, dass das ESM-Modulformat verwendet wird |
main | Einstiegsdatei |
files | Die Liste der Dateien, die nur bei der Veröffentlichung einbezogen werden |
dsh.bundle.patch | Bundle-Manifest: deklariert den Pfad der beigesteuerten Patch-Datei |
Erstellen Siehello-plugin/index.js, in den Plugin-Eintrag geschrieben.
Beispiel
export const name = 'hello-plugin' // Plugin-Name, verwendet für Protokollierung und Diagnose
export function apply() {
console.log('[hello-plugin] plugin loaded!') // Beim Laden eine Logzeile ausgeben
}
Erstellen Siehello-plugin/cordis.patch.yml。
Beispiel
# Dieser Patch ist, wie das übliche --patch-Overlay, ein YAML-Array aus Patch-Einträgen.
# Unterschied: Plugin-Zeilen werden über den Paketnamen statt über einen relativen Quellpfad referenziert, damit die Node-Modulauflösung den installierten Code finden kann
- insert:
- id: hello
name: dsh-hello-plugin
Dieser Patch und das--patch-Overlay sind vollständig isomorph.
Der entscheidende Unterschied ist dasnameFeld: Hier steht der Paketnamedsh-hello-plugin, nicht der relative Quellpfad.
Nach der Installation verlinkt pnpm das Paket in node_modules, sodass die Node-Modulauflösung den installierten Code über den Paketnamen finden kann.
nein
dsh.bundleDas deklarierte Paket kann weiterhin installiert werden, aber nur als reguläre Abhängigkeit.zu diesem Zeitpunkt
dsh pluginEs wird eine Warnung ausgeben und keine Ebene aktivieren.Wenn eine Bibliothek von Plugin-Paketen importiert werden soll, anstatt von Benutzern aktiviert zu werden, verwenden Sie dieses Paketformat.
Profil-Manifest: muss niemals von Hand geschrieben werden
Das Profilverzeichnis enthält zwei Dateien.
Die erste istpackage.json, enthält die Out-of-Tree-Plugin-Abhängigkeiten des Profils (verwaltet von pnpm), plusdsh.profileDas Manifest und seine geordnetebundlesListe.
Die zweite istcordis.patch.yml, ist die eigene Patch-Ebene des Benutzers, die nach jeder Bundle-Ebene angewendet wird.
Das Profil-Manifest muss niemals von Hand geschrieben werden.
dsh pluginist für dessen Erstellung und Pflege verantwortlich; der nächste Artikel zeigt seine tatsächlichen Ergebnisse bei der Installation des Plugins.
Fortgeschritten: Lassen Sie das Surface-Bundle seine eigene Kommandozeile beherbergen
Ein Bundle, das eine ausführbare Anwendung definiert, kann ein gewöhnliches Provider-Plugin einbinden, um seine eigene Kommandozeile zu beherbergen.
Dieses Provider-Plugin exportiertinject = ['cmdlineArgs'], rufen Sie es mit Ihrem eigenen Commander-Programm aufparseCmdline, dann die eigenen Dienste der Anwendung in der eigenen Aktion des Programms bereitstellen.
Beispiel
- id: hello-startup
name: 'dsh-hello-plugin/startup'
Durch diese Parameter konfigurierte Zeilen injizieren den Provider-Dienst und lesen ihn in ihren eigenen!!jsoptions, während sie den Deployment-Wert daneben als Fallback schreiben.
Beispiel
- id: my-app
name: '@example/my-app'
inject: [myAppStartup]
config:
port: !!js ctx.myAppStartup.port ?? 8080
Der Launcher übergibt nach seinen eigenen Flags dieselben unveränderlichen Argumente an jedes Plugin, sodass das Hinzufügen app-spezifischer Flags keine Änderungen am Launcher erfordert und mehrere Plugins denselben Snapshot parsen können.
encounter--helpWenn der Provider den Dienst nicht veröffentlichen wird, werden diese Zeilen nicht aktiviert.
Der Loader mountet die Komposition nur einmal, wartet auf die normale Injektion jeder Zeile und wertet dann die Zeile anhand ihres injizierten Kontexts aus.!!jsKonfiguration.
Zusammenfassung und Selbsttest
Kombinierte Paketdeklarationdsh.bundleUm "was beigetragen wird" zu beantworten, deklariert das Profildsh.profileBeantworten Sie "aus welchen Bundles es besteht"; beide werden von einer einzigen package.json getragen, haben aber unterschiedliche Manifeste.
Selbsttestfragen:
- Welchen Schlüssel deklariert das Manifest des Bundles, und welche Frage beantwortet er?
- In welchem Verzeichnis befindet sich das Profil, und welche Frage beantwortet sein Manifest?
- Warum verwendet die cordis.patch.yml von hello-plugin den Paketnamen anstelle eines relativen Quellpfads?