在 Shadcn 创建的 Next.js Monorepo (使用 pnpm dlx shadcn@latest init 生成) 中配置 release-please,你需要针对 Turborepo + pnpm workspace 的结构进行特定配置。
该结构通常包含 apps/web (主应用) 和 packages/ui (组件库)。配置的核心目标是让 release-please 能够识别这两个独立的工作区,并分别(或联动)管理它们的版本和变更日志。
以下是详细的配置步骤:
1. 准备工作
确保你的提交信息遵循 Conventional Commits 规范(例如 feat: add button, fix: login bug),这是 release-please 自动生成版本号和 Changelog 的基础。
2. 创建配置文件
在项目根目录下创建两个文件:
A. release-please-config.json
这是主配置文件。我们需要告诉 release-please 有哪些包需要管理。由于是 Monorepo,我们需要使用 packages 字段映射路径。
json
1{
2 "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json",
3 "release-type": "node",
4 "include-component-in-tag": true,
5 "tag-separator": "@",
6 "packages": {
7 "apps/web": {
8 "release-type": "node",
9 "package-name": "web"
10 },
11 "packages/ui": {
12 "release-type": "node",
13 "package-name": "ui"
14 }
15 },
16 "plugins": [
17 {
18 "type": "node-workspace",
19 "updateAllPackages": true,
20 "updatePeerDependencies": true
21 },
22 {
23 "type": "linked-versions",
24 "groupName": "all",
25 "components": ["web", "ui"]
26 }
27 ]
28}include-component-in-tag: true: 生成的 Tag 会带上前缀,例如web@1.0.1或ui@0.2.0,这对于 Monorepo 至关重要。linked-versions(可选): 如果你希望web和ui始终保持版本号一致(共进退),保留此配置。如果你希望它们独立发版,请删除整个plugins数组。package-name: 对应你package.json中的name字段。
B. .release-please-manifest.json
这是版本管理的“数据库”文件,用于记录当前的起始版本。
json
1{
2 "apps/web": "0.1.0",
3 "packages/ui": "0.1.0"
4}- 请根据你实际
package.json中的版本号修改这里的初始值。
3. 配置 GitHub Action
在 .github/workflows/release-please.yml 创建工作流文件:
yaml
1name: Release Please
2
3on:
4 push:
5 branches:
6 - main
7
8permissions:
9 contents: write
10 pull-requests: write
11
12jobs:
13 release-please:
14 runs-on: ubuntu-latest
15 outputs:
16 # 导出变量供后续步骤使用(例如自动部署)
17 web--release_created: ${{ steps.release.outputs['apps/web--release_created'] }}
18 ui--release_created: ${{ steps.release.outputs['packages/ui--release_created'] }}
19 steps:
20 - uses: google-github-actions/release-please-action@v4
21 id: release
22 with:
23 # 使用默认的 GITHUB_TOKEN 即可
24 token: ${{ secrets.GITHUB_TOKEN }}
25 config-file: release-please-config.json
26 manifest-file: .release-please-manifest.json
27
28 # (可选) 示例:当 web 应用发布新版本时自动打印日志或触发部署
29 deploy-web:
30 needs: release-please
31 if: ${{ needs.release-please.outputs.web--release_created }}
32 runs-on: ubuntu-latest
33 steps:
34 - uses: actions/checkout@v4
35 - name: Display release info
36 run: |
37 echo "New release created for Web!"4. 处理 pnpm workspace:* 协议的注意事项
在 Shadcn 的 Monorepo 中,apps/web 通常通过 "ui": "workspace:*" 依赖 packages/ui。
release-please 的行为:
当 packages/ui 发布新版本(例如 0.2.0)时,release-please 会尝试更新 apps/web 的 package.json。
- 如果你使用了
workspace:*,release-please有时会将其替换为具体的版本号(如^0.2.0)。 - 建议:为了保持开发体验,如果不希望它替换
workspace:*,可以在release-please-config.json中配置node-workspace插件(如上文配置所示),或者手动维护依赖。 - 但通常标准做法是:让
release-please将其更新为具体版本号,这样发布的生产环境包指向明确的版本;而在开发环境你可以手动改回或保持该版本号。
5. 验证流程
- 提交上述配置文件到
main分支。 - 创建一个新的 Commit,例如:
fix(ui): update button style。 - 推送到
main。 - 等待 Action 运行。
release-please会自动创建一个名为chore: release ...的 Pull Request。 - 合并该 PR:合并后,GitHub Action 会再次运行,自动打 Tag (如
ui@0.1.1) 并创建 GitHub Release。
总结 Checklist
- 根目录有
release-please-config.json - 根目录有
.release-please-manifest.json - GitHub Workflow 权限设置了
contents: write和pull-requests: write -
package.json中的name字段与配置中的package-name对应