Skip to content

20 个已发布包没有 files 白名单,把 src/、测试文件和构建脚本一起发到 npm #4248

Description

@os-zhuang

发现于 #4206:那个 PR 要把 <包根>/scripts/** 排除出 docs-drift 的实现改动判定,落地前需要核实「有没有包把 scripts/ 当运行时代码发布」。核查 files 字段时发现了一个更广的打包卫生问题。

现状

仓库里 20 个非 private 包没有 files 字段,npm 因此按默认规则打包整个目录:

packages/formula                        @objectstack/formula
packages/sdui-parser                    @objectstack/sdui-parser
packages/connectors/connector-mcp       @objectstack/connector-mcp
packages/connectors/connector-openapi   @objectstack/connector-openapi
packages/connectors/connector-rest      @objectstack/connector-rest
packages/connectors/connector-slack     @objectstack/connector-slack
packages/plugins/embedder-openai        @objectstack/embedder-openai
packages/plugins/knowledge-memory       @objectstack/knowledge-memory
packages/plugins/knowledge-ragflow      @objectstack/knowledge-ragflow
packages/plugins/plugin-approvals       @objectstack/plugin-approvals
packages/plugins/plugin-email           @objectstack/plugin-email
packages/plugins/plugin-pinyin-search   @objectstack/plugin-pinyin-search
packages/plugins/plugin-reports         @objectstack/plugin-reports
packages/plugins/plugin-sharing         @objectstack/plugin-sharing
packages/plugins/plugin-webhooks        @objectstack/plugin-webhooks
packages/services/service-cluster       @objectstack/service-cluster
packages/services/service-cluster-redis @objectstack/service-cluster-redis
packages/services/service-datasource    @objectstack/service-datasource
packages/services/service-sms           @objectstack/service-sms
packages/triggers/trigger-api           @objectstack/trigger-api

对照组:specobjectqlplatform-objectsplugin-auditplugin-securitydriver-sqlite-wasmservice-messagingservice-realtimeservice-storage 都声明了 files(基本是 ["dist","README.md"]),所以这 20 个是漏了,不是有意的另一套约定。

实测

npm pack --dry-run on @objectstack/plugin-webhooks:

文件数: 21 | 分布: { src/: 15, scripts/: 1, 其他: 5 }
其中测试文件: 3
  src/auto-enqueuer.test.ts
  src/bootstrap-declared-webhooks.test.ts
  ...
  scripts/i18n-extract.config.ts

即消费者装到的是 TypeScript 源码 + 单元测试 + 构建期工具配置。(该检出未构建,所以 dist/ 未出现在列表里;真实发布时 dist/ 会在这些之上另加,不会替代它们。)

为什么值得修

  1. 体积与噪声 —— 测试文件对消费者零价值,却计入安装体积和依赖扫描面。
  2. scripts/ 被发布是 fix(docs-audit): derive package roots from the filesystem, not a special-cased regex #4206 那条排除臂的唯一潜在反例。 目前结论仍成立 —— 这 20 个包里带 scripts/ 的三个(plugin-approvals / plugin-sharing / plugin-webhooks)装的都只是 i18n-extract.config.ts,是构建期工具而非运行时代码,所以「scripts/** 不算实现改动」没有被证伪。但这个结论是靠逐个人工核对内容得到的,不是靠任何机制保证的:哪天有人往某个包的 scripts/ 放进运行时代码并发布,fix(docs-audit): derive package roots from the filesystem, not a special-cased regex #4206 的排除就会开始漏报,而没有任何东西会喊一声。
  3. 一致性 —— 一半包声明 files 一半不声明,是 排查「手抄 spec 清单 + "keep in sync" 注释」模式:一天内确认三例,全部曾静默漂移 #3786 那类「手抄清单没有闸门」的形状。

建议

给这 20 个包补 "files": ["dist", "README.md"](与已有包对齐;个别包若确实需要发布 src/ 做 source map 调试,单独说明并显式列出)。

真正治本的是加一道闸门,而不是补完这一轮就完事 —— 例如在 lint 阶段断言「每个非 private 包都必须声明 files」。仓库里 scripts/check-*.mjs 已经有一整套同形状的守卫可循,加一条的成本很低,且能顺带让 #4206 的那个假设从「人工核对过」变成「持续被校验」。

Activity

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

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions