本文档解释了 shadcn-ui 项目的自动化发布管理系统,涵盖了处理 CLI 包到 NPM 的发布操作的 beta/预发布和稳定发布工作流。该系统使用 GitHub Actions、changesets 和 pnpm 来管理版本升级和包分发。
有关构建组件注册表的信息,请参阅 构建组件注册表。有关创建自定义注册表的指导,请参阅 构建自定义注册表。
shadcn-ui 项目支持两种不同的发布工作流
| 发布类型 | 触发器 | 目的 | 软件包标签 |
|---|---|---|---|
| Beta 发布 | 带有 🚀 autorelease 标签的 PR | 测试未发布的功能 | @beta |
| 稳定发布 | 推送到 main 分支 | 生产就绪版本 | @latest |
两个工作流都将目标对准位于 packages/shadcn 的活动 CLI 包,而位于 packages/cli 的旧版 CLI 已弃用。
来源: .github/workflows/prerelease.yml6-14 .github/workflows/release.yml6-8 packages/cli/README.md3-6
当 pull request 被打上 🚀 autorelease 标签时,将启动 beta 发布过程。该工作流执行以下步骤:
环境设置:工作流在 Ubuntu 上运行,使用 Node.js 18 和 pnpm 9.0.6,出于安全考虑需要 shadcn-ui 的所有权。
版本修改:自定义脚本在发布前修改包版本以包含 beta 标识符。
NPM 发布:使用 pnpm pub:beta 命令通过环境变量 secret 进行 NPM 身份验证来发布包。
Artifact 管理:构建的包作为工作流 artifact 上传,名称模式为 npm-package-shadcn@{version}-pr-{number}。
来源: .github/workflows/prerelease.yml12-14 .github/workflows/prerelease.yml39-48 .github/workflows/prerelease.yml56-60
成功 beta 发布后,一个自动化评论系统会通知 PR 作者
Artifact 解析:系统使用正则表达式 /^npm-package-shadcn@(.*?)-pr-(\d+)/ 从 artifact 名称中提取版本和 PR 号。
用户通知:发布一个固定的评论,其中包含安装命令 pnpm dlx shadcn@{version}。
标签清理:自动删除 🚀 autorelease 标签,以防止重复发布。
来源: .github/workflows/prerelease-comment.yml23-42 .github/workflows/prerelease-comment.yml48-53 .github/workflows/prerelease-comment.yml55-65
稳定发布工作流使用 changesets 进行版本管理和自动化发布
构建过程:工作流在进行发布步骤之前,使用 pnpm shadcn:build 构建 CLI 包。
Changeset 集成:changesets/action 根据仓库中的 changeset 文件来处理版本升级和发布决策。
自定义版本脚本:位于 .github/changeset-version.js 的自定义脚本在发布前处理版本更改。
条件发布:根据 changeset 的状态,工作流要么创建一个版本 PR 以供手动批准,要么直接发布到 NPM。
来源: .github/workflows/release.yml39-40 .github/workflows/release.yml42-53
两个工作流都实现了安全措施和一致的环境
| 配置 | Beta 工作流 | 稳定工作流 |
|---|---|---|
| 仓库检查 | github.repository_owner == 'shadcn-ui' | github.repository_owner == 'shadcn-ui' |
| Node.js 版本 | 18 | 18 |
| pnpm 版本 | 9.0.6 | 9.0.6 |
| 环境 | 预览 | 默认 |
| NPM Token | NPM_ACCESS_TOKEN | NPM_ACCESS_TOKEN |
Fetch Depth:两个工作流都使用 fetch-depth: 0 来确保为版本计算和 changeset 处理提供完整的 git 历史记录。
缓存:Node.js 设置包括 pnpm 缓存配置,以优化工作流运行期间的构建时间。
来源: .github/workflows/prerelease.yml17 .github/workflows/prerelease.yml22-34 .github/workflows/release.yml18-31
工作流为不同的发布类型使用不同的 pnpm 脚本
pnpm pub:beta - 发布时带有 beta 标签npx changeset publish - 发布时带有 latest 标签身份验证通过 .npmrc 配置处理,该配置包含 packages/shadcn 目录的 NPM 访问令牌。
来源: .github/workflows/prerelease.yml43-48 .github/workflows/release.yml49