DocsJS npmjs 自动化发布复盘(Trusted Publisher)
本文是 @coding01/docsjs、@coding01/docsjs-editor、@coding01/docsjs-markdown 的发布复盘与最终标准方案。目标是:后续发布只走一条稳定路径,不再重复踩坑。
产品矩阵与链接、

1) @coding01/docsjs(核心引擎)
Word/DOCX 高保真导入与渲染核心,提供 Web Component + React/Vue 适配能力。
- 官网:docsjs.coding01.cn/
- GitHub:github.com/fanly/docsj...
- npmjs:www.npmjs.com/package/@co...
2) @coding01/docsjs-editor(编辑器桥接层)
面向多编辑器(如 CKEditor/Tiptap 等)的集成桥接层,负责快照注入、读回与适配切换。
- GitHub:github.com/fanly/docsj...
- npmjs:www.npmjs.com/package/@co...
3) @coding01/docsjs-markdown(Markdown 转换层)
将 docsjs HTML 快照或 DOCX 转换为 Markdown(Standard/GFM/frontmatter)。
- 产品页:fanly.github.io/docsjs-mark...
- GitHub:github.com/fanly/docsj...
- npmjs:www.npmjs.com/package/@co...
1. 最终发布架构
只保留一条 npmjs 发布链路:
- Git tag 触发:
v*.*.* - GitHub Actions workflow:
.github/workflows/publish.yml - npm Trusted Publisher(OIDC)签发并发布
npm publish --provenance --access public
明确禁止:
- 在
ci.yml里再做第二条发布路径 - 混用
NPM_TOKEN和 Trusted Publisher - 同时维护多个"看起来都能发布"的 workflow
2. 这次踩到的关键问题
问题 A:E404 Not Found - PUT https://registry.npmjs.org/@coding01%2fdocsjs
现象:
- 构建、测试、verify 全通过
- publish 阶段报
E404
根因:
- 包级 Trusted Publisher 绑定和实际 OIDC 身份不匹配,或存在脏配置。
验证方法:
- 在 workflow 中打印 OIDC claims(sanitized):
subrepositoryworkflow_refjob_workflow_refref
- 用 claims 对照 npm 包页面的 Trusted Publisher 配置逐字段比对。
问题 B:ENEEDAUTH This command requires you to be logged in
现象:
- CI 中报需要
npm adduser
根因:
ci.yml里残留了 token 发布 job(NODE_AUTH_TOKEN指向仓库 secretNPM_TOKEN),不是 Trusted Publisher 路径。
修复:
- 删除
ci.yml里的发布 job - 发布只由
publish.yml负责
问题 C:CI workflow 无效
现象:
Invalid workflow file(Line: 9): Unexpected value 'tag'
根因:
- YAML 触发字段写错:
tag应为tags(在push下)。
问题 D:Linting could not start
现象:
vp check报 lint 无法启动
处理策略:
- 拆分检查职责,避免重复启动 lint:
lint:vp lint .fmt:check:vp check --no-linttypecheck:vp exec tsc --noEmit
verify改为串联上述步骤,降低工具链并发冲突概率。
3. 当前标准配置(必须保持)
3.1 publish.yml
要求:
permissions包含id-token: writeon.push.tags为v*.*.*npm ci+npm run verify- 仅执行
npm publish --provenance --access public
3.2 ci.yml
要求:
- 只做质量检查(lint/fmt/typecheck/test/build)
- 不做 npm 发布
3.3 package.json
建议:
- 保留
publishConfig.access=public prepublishOnly走verifyprepare在 CI 中应可安全跳过(避免发布时副作用)
4. 发布前检查清单(实战)
每次发版前按顺序执行:
- 本地:
npm run verify
- 包信息:
name、version、files、exports正确
- Git:
package.json版本与 tag 一致git tag vX.Y.Z
- npm 包页面:
- Trusted Publisher 指向正确 repo + workflow filename
- Actions:
- 只有
publish.yml执行发布
- 只有
5. 故障快速定位流程
如果发布失败,按这个顺序排:
- 先看失败 step:
Verify失败:先修代码/脚本Publish失败:优先查 npm 权限或 Trusted Publisher 绑定
- 看错误码:
E404:通常是 TP 绑定不匹配/权限隐藏ENEEDAUTH:说明走了 token 登录路径,不是 TP 路径
- 看 OIDC claims:
- 逐字段比对
repository/workflow_ref/ref/sub
- 逐字段比对
6. 结论
正确做法不是"多加一条兜底发布",而是保证发布链路唯一、可观测、可复现:
- CI 只做质量门
- publish workflow 只做 Trusted Publisher 发布
- 所有失败都能映射到单一责任面(代码、workflow、npm 绑定)
按本文执行,可以稳定避免本轮出现过的 E404、ENEEDAUTH、workflow 语法错误和 lint 启动异常。