description: "dsh app bin 的应用自有命令行:应用从启动器剩余参数中解析自己的 flag、--help 与退出行为。"
English | 中文
dsh-cmdline 让应用从启动器 flag 之后原样留下的参数中解析自己的 flag、--help 与错误。解析值可以覆盖配置默认值,而无需改写配置。应用还可以通过启动器的关停路径请求进程退出。适用于拥有自有命令行界面的应用 bin。它不增加提示词、schema 或模型可见内容。
你的应用在启动时读取本次调用的内层参数,任意数量的插件都可以使用它们。常用路径是:启动插件读取参数、解析它们,再发布解析后的值;其他行由这些值配置自身。
启动器向你的应用提供三样东西:
ctx.cmdlineArgs——本次调用的内层参数。读取它返回一份不可变快照,且绝不会消费或修改它们:dsh --profile tui --resume abc 给你的应用 ['--resume', 'abc']。ctx.appExit——在整棵树关闭后请求进程退出的方式,接到启动器的关停控制器上。ctx.appReady——成功启动信号,只在 Loader 树与启动器自有设置成功后提交。没有参数的启动会看到空列表——这是诚实的答案,而不是缺失的值。
exitOnStdinEnd(ctx, label) 把已成功启动的 stdio 应用 EOF 绑定到 ctx.appExit(0)。它绝不读取或恢复 stdin,因此协议传输会收到挂载前已缓冲的字节;启动拒绝优先于竞态 EOF,所属 fiber 会移除两个待处理的监听器。
你自带自己的 commander program:声明你的 flag 与 action,本包会针对内层参数运行它。校验只发生在你的 action 中,并由它发布你的行所需的任何值。插件的 Loader 行不携带特殊标记:
- id: web-startup
name: '@deepseek-ai/dsh-web-app/startup'
由解析值配置的行注入发布的服务,并在其配置中直接读取它:
- id: webserver
name: '@deepseek-ai/dsh-host-webserver'
inject: [webStartup]
config:
host: !!js ctx.webStartup.host ?? '127.0.0.1'
port: !!js ctx.webStartup.port ?? 3080
结果:即使配置写的是 3080,dsh --profile web --port 8080 也会让服务器监听 8080 端口,因为 flag 优先。--help 打印你的应用帮助并以 0 退出、不启动任何内容;被拒绝的值(例如非数字端口)打印你的错误并以非零码退出,任何依赖解析值的行都不会启动。
写在 !!js 表达式旁的值是后备:flag 存在时 flag 优先,否则使用写下的值。配置求值在启动时、你的解析器运行之后执行一次,因此 flag 绝不会被之后的配置重载悄悄重置。
任意数量的插件都可以读取同一份参数——读取绝不会消费它们——每个插件都能解析自己需要的部分并发布各自的值。启动器不会决定谁是命令行的所有者:没有读取方的应用会忽略自己的参数。
本仓库之外构建的应用行为一致:即使它们自带 commander 副本,其 --help 也会打印并退出,而不是崩溃。
当包级约定不够用时阅读以下页面。它们从交接机制逐步进入消费它的应用。
无。本包在任何会话存在之前解析进程自身的命令行;所有模型可见的影响都由配置行产生。
无;本包既不组装也不发送提供方请求。
这些限制说明应用自有命令行在何时不合适,或何时需要特别注意。它们是当前包约束,不是任务积压。
--patch 属于应用。启动器的解析器会消耗掉一个 --,因此需要以字面量 -- 传给应用的参数必须写成 -- --。config,会连同其中的表达式一起丢掉——flag 胜过的是表达式旁写着的那个值,而不是用户用字面量替换掉表达式之后的结果;保留表达式才能保留 flag 的优先级。