Skip to content

fix(exports): 导出 ./package.json,修复打包宿主上客户端半区被静默跳过 - #2

Merged
KannaKuron merged 1 commit into
KannaKuron:mainfrom
sitns:fix/exports-package-json
Sep 20, 2026
Merged

KannaKuron merged 1 commit into
KannaKuron:mainfrom
sitns:fix/exports-package-json

Conversation

@sitns

@sitns sitns commented Sep 20, 2026

Copy link
Copy Markdown
Contributor

问题

从 npm 安装(dsh plugin --profile <name> add dsh-ide-git)后,插件在 DSH Desktop 这类打包宿主上完全不出现:

  • better-sidebar 的 + 新建标签页列表里没有 Git 条目;
  • DSH 原生右侧栏 Guide 页也没有 Git 胶囊;
  • 浏览器控制台零报错,宿主启动健康,插件在设置里显示已启用;
  • 宿主的 /dsh-ide-git/api/* 路由存在(打到信任围栏,403 而非 404)→ 宿主半区是活的

即:宿主半区加载成功,客户端半区从未到达浏览器。详见 #1

根因

@deepseek-ai/dsh-client-modules 的宿主半区在 locatePkgJson() 里定位 loader 条目的包清单。Loader 未提供内部 resolveSync 时(打包宿主走的回退分支):

createRequire(baseUrl).resolve(`${expectedPackageName}/package.json`)

本包 exports 只导出 ../client,该解析抛 ERR_PACKAGE_PATH_NOT_EXPORTEDlocatePkgJson 返回 undefinedresolveMeta() 返回 nullprocessOne() 把这行当作「未声明 dsh.client静默跳过(不抛错、不告警)。

修复

   "exports": {
     ".": "./src/index.js",
-    "./client": "./src/client.js"
+    "./client": "./src/client.js",
+    "./package.json": "./package.json"
   },

验证

用 DSH 自带的 @deepseek-ai/dsh-client-modules 真实代码resolveMeta()ctx.loader.internalundefined 即上述回退分支:

修复前  no-internal | dsh-ide-git        => NULL (silently skipped)
        no-internal | dsh-scratchpad     => OK
        no-internal | dsh-better-sidebar => OK
修复后  no-internal | dsh-ide-git        => OK -> ...\dsh-ide-git\src\client.js

对照同 profile 的其它插件——它们的 exports 都带 "./package.json": "./package.json",所以不受影响:

exports
dsh-ide-git ., ./client ← 缺
dsh-scratchpad ., ./client, ./cordis.patch.yml, ./package.json
dsh-better-sidebar ., ./invariant, ./client, ./client/service, ./client/api, ./src/*, ./package.json

真机确认:补上该行后用 link: 安装,fetch('/plugins/?id=dsh-ide-git&rev=…') 不再 404,面板正常出现在侧边栏。

环境:DSH 0.1.5-rc.2(DSH Desktop 2.0.13,Windows 11)、宿主 Node v24.18.1、dsh-ide-git 0.5.5、npm 安装。

建议(可选,不在本 PR 内)

现有三层测试都不过 DSH 的真实组合器,所以这个缺陷一路绿灯。可在 tests/smoke.mjs 补一条解析门

createRequire(import.meta.url).resolve('dsh-ide-git/package.json')

未改 CHANGELOG.md

按仓库「变更记录纪律」,条目随版本提交,留给维护者发版时补,以免与 npm version 流程冲突。需要我加的话说一声。

`@deepseek-ai/dsh-client-modules` 的宿主半区在 `locatePkgJson()` 里定位 loader
条目的包清单。Loader 未提供内部 `resolveSync` 时(DSH Desktop 这类打包宿主走的就是
这条回退分支)它调用:

    createRequire(baseUrl).resolve('<pkg>/package.json')

本包的 `exports` 只导出 `.` 与 `./client`,该解析抛
`ERR_PACKAGE_PATH_NOT_EXPORTED` → `locatePkgJson` 返回 `undefined` →
`resolveMeta()` 返回 `null` → `processOne()` 把这行当作「未声明 dsh.client」
**静默跳过**(不抛错、不告警)。后果:

- 宿主半区照常激活(`inject = ['webServer']` 满足),启动审计
  `assertEntriesActivated` 也通过,宿主日志无任何相关记录;
- `/plugins/?id=dsh-ide-git&rev=…` 返回 404,客户端半区从未下发,
  浏览器控制台一片干净;
- better-sidebar 的 `+` 新建标签页与原生右侧栏 Guide 页都看不到入口。

对照同 profile 的其它插件:`dsh-scratchpad`、`dsh-better-sidebar` 的 `exports`
都带有 `"./package.json": "./package.json"`,所以不受影响。

复现(用 DSH 自带的组合器真实代码跑 `resolveMeta`,`ctx.loader.internal` 为
undefined 即回退分支):

    no-internal | dsh-ide-git        => NULL (silently skipped)
    no-internal | dsh-scratchpad     => OK
    no-internal | dsh-better-sidebar => OK

补上该导出后两条件码路径均正常,`clientPath` 解析到 `src/client.js`。

环境:DSH 0.1.5-rc.2(DSH Desktop 2.0.13,Windows 11)、宿主 Node v24.18.1、
dsh-ide-git 0.5.5、npm 安装。

Refs: KannaKuron#1
@KannaKuron

Copy link
Copy Markdown
Owner

已合并并随 v0.5.6 发布(npm 已上线、npmmirror 已同步),感谢贡献 🙏

合并前在本机做了复核:npm 0.5.5 复现 ERR_PACKAGE_PATH_NOT_EXPORTED、修复版两项解析全过;50/50 测试绿。CHANGELOG 条目见 v0.5.6。

顺带说明:test 脚本里加的 tests/repos.test.mjs 一并合入了(该文件随 #3 落地;Node 24 的 node --test 对不存在的文件静默跳过,所以两个 PR 分先后合并不影响 CI)。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants