如何用semantic-release同时发布npm包到GitHub和npmjs?
解决semantic-release同时发布npm包到GitHub Packages与npmjs的问题
核心思路
让semantic-release单次运行完成版本计算、标签创建,同时配置两个npm发布插件实例,分别指向GitHub Packages和npmjs,避免重复操作或无效发布。
具体配置步骤
1. 配置semantic-release的发布文件
在项目根目录创建或修改.releaserc.json,添加两个@semantic-release/npm插件实例,分别指定对应仓库的registry和凭证:
{ "branches": ["main"], // 根据你的主分支名称调整 "plugins": [ "@semantic-release/commit-analyzer", "@semantic-release/release-notes-generator", "@semantic-release/git", "@semantic-release/github", // 发布到GitHub Packages [ "@semantic-release/npm", { "registry": "https://npm.pkg.github.com/", "npmPublishToken": "${process.env.GH_TOKEN}", "pkgRoot": "dist" // 若你的包构建后在dist目录,否则可移除 } ], // 发布到npmjs [ "@semantic-release/npm", { "registry": "https://registry.npmjs.org/", "npmPublishToken": "${process.env.NPM_TOKEN}", "pkgRoot": "dist" } ] ] }
2. CI环境变量配置
在CI流程中(比如GitHub Actions、GitLab CI等),设置两个环境变量:
GH_TOKEN: 拥有GitHub Packages发布权限的个人访问令牌(需勾选write:packages权限)NPM_TOKEN: npmjs的发布令牌(需对应包的发布权限)
3. 简化CI工作流
调整后的CI流程只需:
- 执行构建、测试等前置操作
- 执行
npx semantic-release
这样semantic-release会在单次运行中:
- 分析提交记录,判断是否需要发布新版本
- 若需发布,计算版本号、生成Release Notes、创建Git标签
- 依次将包发布到GitHub Packages和npmjs
- 若无需发布,直接跳过所有发布步骤,避免重复发布旧版本报错
注意事项
- GitHub Packages的包名需带组织scope,比如
@your-github-org/package-name,确保package.json中的name字段符合要求 - 可通过
npx semantic-release --dry-run测试配置,不会实际发布包 - 若项目无构建产物,可移除配置中的
pkgRoot字段
内容的提问来源于stack exchange,提问作者AwesomeTown
相关产品推荐
相关产品推荐

