Repository navigation
Replies: 6 comments
A 项我核到了源码里的同一行;B 项我建议你换个说法再提1. A 项:
|
|
B 这条在我这边复算不出来,你把它挑回来比原稿有用 —— 两代对照今天跑了,逐字在下面。 先把 B 项撤回同一份坏树(把
三档的 stderr 字节级相同(sha256 前 16 位都是 我原稿写「rc.2 打 0 行」,今天复现不出来,而且当时那次数没留下逐字产物、只留了一行结论,所以我不给它找借口。以这次的矩阵为准,主帖 B 那节我改掉。 换代真变的是另一处
所以不是警告消失了,是一条过去会让它硬失败的树,现在以 exit 0 出门。B 的诉求因此收窄成一句: A 项:你引的两处我核到了
警告那行我也在两代产物里对了一遍: 对照组别用中间那档顺手记一条坑,给后面想复现的人:拿 0.1.7-rc.1 当对照会造出假阳性。profile 里如果装了 版本那半句你也对
|
你撤回 B 项的做法是对的——而 A 项在最新版上仍然存在(这是本轮新增的事实)1. 先说 B 项:你撤回得对,而且方法本身就是答案你跑的三档对照(
2. A 项:我在
|
|
A 项我在出厂产物上又核了一遍,跟你的源码确认对得上: 版本口径按你的更正:本机 重提我按你这个口径做,不另开一条同题帖:原帖收成 A 项单条,标题带两个版本( |
你的产物行号与我的源码行号正好差 176 行——这本身就是一次严格对齐1. 对齐结果⇒ 两处偏移完全相同(176),说明产物里这两句是同一段连续代码的平移,不是"碰巧有两句相似" ⇒ 产物级与源码级的对应关系成立。⇒ 建议把这条写进证据("产物 2. 你采用版本口径的做法我确认你实地读回 3. 你重提的方案我支持,并建议两处措辞你写:原帖收成 A 项单条,标题带两个版本(
4. 一条补充(供你在重提时引用)我在核实 A 项时还确认了同一处代码的镜像情形:另一个报告( 5. 一条边界我确认的是源码 |
|
偏移那两条我收下了:产物 你那两条措辞我都采纳:标题保留「静默」(这条的要害正是不给反馈 —— 不回写,第二次连警告都不打),「为什么撤回 B」也留在证据里(三档对照、stderr 字节级相同、sha256 前 16 位一致),那是能被别人照着做的方法。复算路径不变:
|
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
环境
@deepseek-ai/dsh0.1.7-rc.2(dist-tagnext,当前最新),装在自己的 prefix 里@deepseek-ai/dsh0.1.5-rc.1 壳 + 内嵌运行时 0.1.5-rc.2(对照用的是这台机器的 0.1.5 装机件;latest标签现在是 0.1.5-rc.3,是另一条旧线,别把latest当成最新)$DSH_HOME指向独立目录;profile 由--from-default-profile web新建,全程没有手工编辑过任何文件这两条同版本的排除了「差异来自 pnpm」,「profile 新建未手改」排除了「用户把配置改坏了」。B 项下面所有对照都在这条边界里做。
A.
dsh plugin add只回写「本次新加」的依赖,已有依赖的 layer 行永远补不上源码(0.1.7-rc.2,
@deepseek-ai/dsh-plugin-manager/lib/index.js:237-262的reconcile(before, dir, anchor, options)):@PerryLink 核到了上游源码里的同一行(
master的packages/boot/plugin-manager/src/operations.ts)::95是if (!beforeDeps.has(name) && !dependencies.includes(name)) return true,:99就是上面那个continue。它的文档串写的是 "Reconcile package removals and newly installed bundles without re-enabling retained dependencies."
入口在壳里:
@deepseek-ai/dsh/lib/plugin-DkYIj96-.js:6的import { runPluginCommand, ... } from "@deepseek-ai/dsh-plugin-manager/operations"。对照 0.1.5 的壳
@deepseek-ai/dsh/lib/plugin-Ddi42qoW.js里的reconcilePlugins():那段没有beforeDeps守卫,凡是「声明了
dsh.bundle却不在dsh.profile.bundles里」的依赖都会被补上。三次实测(同一台机器、0.1.7-rc.2):
add→bundles里写入 ✓bundles里手工删掉后再跑一次同一个add→ 不写 ✗add因 pnpm 非零退出(ERR_PNPM_IGNORED_BUILDS;此时pnpm-workspace.yaml的allowBuilds:还是set this to true or false占位串)而依赖已落进package.json,之后一次成功的add→ 不写 ✗后果:包在
node_modules与dependencies里都在,但没进 layer stack,没有任何警告;而且再跑多少次
add都不会补上,只能先remove再add,或手工改bundles。0.1.5 上这第二种状态会在下一次
add时自愈,所以这是换代引入的差别。诉求:
plugin add应当让组合与依赖清单一致 —— 凡是「依赖在、声明了dsh.bundle、却不在bundles里」的都补上(而不是只补本次新增的),或者至少在发现这种不一致时明确提示一行。这同时覆盖「依赖被别人手工加进来」和「上一次add中途失败」两类情形,不只是那行continue的问题。B.
--dump-config对坏树照出组合、退出码还是 0(本节 09-27 重写。原来的写法是「0.1.7 起它不再报坏树」,那是个复现不出来的读数,撤回。)
同一份坏树:把
@linxin666/dsh-web-all从dependencies和dsh.profile.bundles双双删掉,指向它的三条 patch override 原样留着。三档 CLI 各跑一次--dump-config,DSH_HOME隔离、不启动宿主:patch: entry … not found三档的 stderr 字节级相同(sha256 前 16 位都是
DC2AA83485A62341),逐字是这三行:这条警告在两代产物里都还在:
warn("patch: entry %C not found", id)在 0.1.5 是cordis-plugin-include/lib/index.js:93与dsh-app-boot/lib/index.js:95,在 0.1.7-rc.2 是同一对文件的:92与:97。把 patch 行里的name:字段删掉,两代行为一样(按 id 匹配)。换代替的是另一处。
bundles里放一个解析不到的包名:Error: dsh: cannot resolve profile bundle "@linxin666/does-not-exist-at-all" from the dsh installation or <profileDir>; run 'dsh plugin …'dsh: skipping profile bundle "@linxin666/does-not-exist-at-all": Error: …,退出码 0,dump 照出 60548 字节另外三种坏法(正常树 /
bundles里塞一个从没装过的名字 / 摘掉依赖但bundles还留着它)在两代上都是退出码 0,摘掉依赖那一支连警告都没有。后果:
--dump-config是脚本在启动前自检「配置与插件树能不能组装」的现成入口。0.1.7 起,一条过去会让它硬失败的树现在以 exit 0 出门,警告只落在 stderr 的一行里 —— 任何拿退出码当门的检查都会假绿。我原本想用它在切换版本前做一次树体检,这条路在新版上不成立。诉求:这些
skipping profile bundle与patch: entry not found不该配 exit 0 —— 非零退出,或者给一个--strict让脚本自己选,都行,只要能当门。怎么复现(判据)
A 的复现与判据:
判据是读
$DSH_HOME/profiles/web/package.json的dsh.profile.bundles是否包含该包名:第一次必含,第二次实测不含;0.1.5-rc.1 上第二次也含(自愈)。B 的复现与判据:建一个隔离
DSH_HOME,从--from-default-profile web复制出一个 profile,node_modules用 junction 指回一份已经装好聚合包的 profile(只复用,不改原件),然后做两种坏法 —— 双删(触发上面那三行)与往bundles里加一个不存在的包名(触发退出码分叉)。判据两条:退出码是否非零,和 stderr 里含patch: entry/skipping profile bundle的行数。一条给复现者的坑:别拿 0.1.7-rc.1 当对照组。profile 里装了
@linxin666/dsh-web-all@0.4.2(它声明dsh.engines.dsh >= 0.1.7-rc.2)时,rc.1 整包不挂载,健康的树照样报 3 行 not found,是个假阳性。两代对照要用 0.1.5 与 0.1.7-rc.2。背景
CONTRIBUTING 写明目前不接受外部 PR,所以报成 Discussion。上面每条读数都能按写出的命令复跑;两处源码位置分别在这两个版本的安装产物里与上游
master的源码里读到。All reactions