发现于 #3663 的实施(为「files 条目必须在磁盘存在」补门禁时的全量扫描)。观察类记录,不在该单完成范围内。
事实
在 origin/main(dae1ac4)上全量扫描 40 个声明了 files 的 workspace 包、共 159 条条目,除去 42 条「已被 git-ignore 的构建产物」后,剩下 2 条声明与磁盘不符:
| 包 |
files 条目 |
磁盘 |
git 跟踪 |
git-ignore |
构建产物? |
@object-ui/cli |
templates |
❌ 不存在 |
❌ 未跟踪 |
❌ 未忽略 |
❌ 否 |
@object-ui/create-plugin |
templates |
❌ 不存在 |
❌ 未跟踪 |
❌ 未忽略 |
❌ 否 |
这与 #3647(plugin-tree 声明 LICENSE 而文件不存在)是同一机制:npm 对 files 里不存在的条目静默跳过,不报错、不警告、退出码 0。
三条佐证:这不是「尚未构建」,是残留声明
- 从未存在过。 全分支
git log --diff-filter=A 查这两个路径,返回空 —— 仓库历史里从来没有过 packages/cli/templates 或 packages/create-plugin/templates。
- 没有任何东西会生成它。 两个包的 build 都是
tsup,其 tsup.config.ts 只声明了 entry + dts,产物只进 dist/;.github/workflows/ 与 scripts/ 里 grep templates 无命中。
- 模板已改为内联,不再读磁盘。
packages/cli/src/commands/init.ts:17 —— const templates = { ,模板是源码里的对象字面量。
packages/create-plugin/src/index.ts:115 —— const templateDir = path.join(__dirname, '..', 'templates', 'plugin'); 这一行赋值后再无任何引用(全文件 grep templateDir 只此一处),生成的 package.json 是在代码里逐字段构造的。
为什么记为观察类
今天没有用户会撞上。 两个包的功能都不依赖磁盘上的 templates/(已内联),npm 又静默跳过缺失条目,所以发布出去的 tarball 在效果上是对的 —— 失真的只有 manifest 本身:它声明要打包一个不存在、也永远不会存在的目录。
create-plugin 那个死变量 templateDir 是同一次设计变更的残留,一并记在这里,不单独开单。
可能的处置(供分诊裁决,未实施)
最小修复是把这两行 "templates" 从各自的 package.json files 里删掉(并顺手删掉 create-plugin 的死变量)。
#3663 的门禁(scripts/__tests__/package-files-exist.test.ts)已落地,这 2 条是它的存量,以 ratchet 基线 KNOWN_MISSING 挂账并指向本单 —— 与 scripts/i18n-call-site-key-baseline.json 同一形态:新增违规会红,而本单一旦修好、基线条目变陈旧也会红,逼着把该行删掉。所以本单结清时需要同时删除 KNOWN_MISSING 里的两行。
Generated by Claude Code
发现于 #3663 的实施(为「files 条目必须在磁盘存在」补门禁时的全量扫描)。观察类记录,不在该单完成范围内。
事实
在
origin/main(dae1ac4)上全量扫描 40 个声明了files的 workspace 包、共 159 条条目,除去 42 条「已被 git-ignore 的构建产物」后,剩下 2 条声明与磁盘不符:files条目@object-ui/clitemplates@object-ui/create-plugintemplates这与 #3647(plugin-tree 声明 LICENSE 而文件不存在)是同一机制:npm 对
files里不存在的条目静默跳过,不报错、不警告、退出码 0。三条佐证:这不是「尚未构建」,是残留声明
git log --diff-filter=A查这两个路径,返回空 —— 仓库历史里从来没有过packages/cli/templates或packages/create-plugin/templates。tsup,其tsup.config.ts只声明了entry+dts,产物只进dist/;.github/workflows/与scripts/里 greptemplates无命中。packages/cli/src/commands/init.ts:17——const templates = {,模板是源码里的对象字面量。packages/create-plugin/src/index.ts:115——const templateDir = path.join(__dirname, '..', 'templates', 'plugin');这一行赋值后再无任何引用(全文件 greptemplateDir只此一处),生成的package.json是在代码里逐字段构造的。为什么记为观察类
今天没有用户会撞上。 两个包的功能都不依赖磁盘上的
templates/(已内联),npm 又静默跳过缺失条目,所以发布出去的 tarball 在效果上是对的 —— 失真的只有 manifest 本身:它声明要打包一个不存在、也永远不会存在的目录。create-plugin那个死变量templateDir是同一次设计变更的残留,一并记在这里,不单独开单。可能的处置(供分诊裁决,未实施)
最小修复是把这两行
"templates"从各自的package.jsonfiles里删掉(并顺手删掉create-plugin的死变量)。与 #3663 的关系
#3663 的门禁(
scripts/__tests__/package-files-exist.test.ts)已落地,这 2 条是它的存量,以 ratchet 基线KNOWN_MISSING挂账并指向本单 —— 与scripts/i18n-call-site-key-baseline.json同一形态:新增违规会红,而本单一旦修好、基线条目变陈旧也会红,逼着把该行删掉。所以本单结清时需要同时删除KNOWN_MISSING里的两行。Generated by Claude Code