Repository navigation
[Bug] LocalSubprocessRuntime.spawn() drops the internals argument when calling launchWindowsJob/launchLinuxScope #11893
Replies: 3 comments
|
This is the same class as #12532 (after the earlier refactor): Fix on the fork (same change covers this thread): |
补充:master 仍未修,且没有 issue/PR 通道可以推进现状复核(2026-11-10,直接读 master 源码)
? launchWindowsJob(spec, env)
: launchLinuxScope(spec, env, linuxScope.literalArgv)
结果(为什么这个 seam 至今无人可用)
这不是"某个插件不兼容",而是声明出来的扩展点在生产路径上不可达。 为什么只能在这里说本仓库已关闭 issues/PR 功能( 如果维护者愿意,我可以把这个修复整理成 PR(或者由你们从 fork 合入)。 需求方背景(供评估优先级)本项目是 DSH 的 Windows x64 专用 AOT runner 插件,通过
也就是说这一个 1 行参数的缺失,挡住了约 60% 的子进程启动开销。 MIT 许可,可以无痛并入上游(连 vendor 补丁机制一起删掉)。 |
Uh oh!
There was an error while loading. Please reload this page.
摘要
LocalSubprocessRuntime.spawn()调用launchWindowsJob()/launchLinuxScope()时漏传第三个参数internals,导致这两个函数声明的internals形参永远是空对象,所有基于internals的注入点(runnerInvocation、spawn、taskkill、platform…)全部失效。影响:文档注释写着「test hook」,但外部插件生态也没有别的接缝可用 —— 任何想在不改 DSH 源码的前提下替换 subprocess runner 的实现都做不到。我在做一个 NativeAOT runner 替代品时踩到了这个坑。
修复是 1 行。
版本
@deepseek-ai/dsh-subprocess-local0.2.0-rc.2缺陷位置
lib/index.js:1368:而两个 launch 函数的签名都接受第三个参数:
spawn()里明明构造好了internals(同文件 1361-1364 行),却没有往下传:结果
launchWindowsJob内部internals恒为{},internals.runnerInvocation恒为undefined,必然回落到spawnRunnerInvocation()。对比:
fallback分支走spawnSubprocess(spec, internals),internals传到位了(那里internals.spawn/internals.taskkill/internals.platform均生效)。所以这是两条路径之间的不一致,不是设计意图。修复
internals里其余字段(spawn/taskkill/platform/probeCurrentTokenJobSupport等)也会一并恢复生效 —— 目前它们在主路径上同样被静默忽略。复现
internals.spawn被调用次数为 0,internals.runnerInvocation被完全忽略。我实测的收益(说明为什么在意这个)
这不是一个纯理论问题。我在做一个 NativeAOT runner,目标是用原生 exe 替换
runner.js这个纯转发进程(每次都要付一遍 Node.js 启动成本)。手动补上这一行后,在真实的
launchWindowsJob路径上交替采样(3 轮 × 100 次):(题外话:我自己也栽过一次 —— 最初写的 e2e 测试只断言了
internals.runnerInvocation字段被赋值,就认为"注入成功",结果插件装到真实 DSH 里毫无作用。是新加了进程级观测才发现。这类"字段设了但没人读"的接缝,如果能有个断言internals真的被消费的测试,会安全很多。)为什么对生态有影响
「Everything is a Plugin」是 DSH 的定位,而 subprocess 是所有工具调用的必经之路。目前第三方如果想优化这条链路:
fallback分支 → 会丢掉 Job Object 进程隔离,且它本来就不接受runnerInvocation,不可接受internals目前注释为 test hook,如果无意长期作为扩展点,那这个 issue 至少也该修掉「声明了参数却不传」的不一致;如果有意开放,那这 1 行就是前提。附
internals计划改成别的形态,也欢迎说一声,我这边好对齐谢谢!
All reactions