monorepo 发布库 --- 发布
目录
版本控制和发布
为什么要使用changesets
添加changesets
初始化
成changeset文件
发布正式版本
将 Changesets 与 Turborepo 一起使用
npm publish发布到在线仓库时,提示:Scope not found
版本控制和发布
在 monorepo 中手动版本控制和发布包可能很繁琐。 幸运的是,有一个工具可以简化操作 - Changesets CLI。
我们推荐 Changesets,因为它使用直观,并且 - 就像 Turborepo 一样 - 符合你已经习惯的 monorepo 工具。
一些替代方案是
- intuit/auto - 基于拉取请求上的语义版本标签生成发布
- microsoft/beachball - 最阳光的语义版本提升器
一旦你的包被打包,你就可以将其发布到 npm 注册表。
我们建议查看 Changesets 文档。 这是我们推荐的阅读顺序
为什么要使用changesets
changesets旨在简化您的工作流程,允许贡献者在贡献过程中做出关键决策。changesets包含两条关键信息:版本类型(遵循semver 规范)以及要添加到变更日志的变更信息。
本指南旨在帮助软件包维护者添加变更集。有关贡献者的信息,请参阅添加变更集。
初始化后的整体工具应该会进入如下循环:
- 每次变更都会添加变更集
- 当发布准备就绪时运行版本命令,并验证更改
- 随后运行发布命令。
后两个步骤可以作为 CI 过程的一部分。
添加changesets
changesets
主要关心 monorepo
项目下子项目版本的更新、changelog
文件生成、包的发布。
pnpm add @changesets/cli -D
- 在开发时,需要开发者提供本次变更涉及的包名称、升级版本类型(
patch
、minor
、major
)及变更信息,即changeset
。 - 在发布版本时,会根据
changeset
自动升级对应包的版本号,并在对应的包中生成Changelog
信息。 - 在
Monorepo
场景中,changeset
会自动生成仓库依赖图,升级时只会升级变更包及相关依赖包的版本号
初始化
执行 changeset init
,在项目根目录下生成一个 .changeset
目录,里面会生成一个 changeset
的 config
文件
pnpm changeset init
{"$schema": "https://unpkg.com/@changesets/config@3.1.1/schema.json","changelog": "@changesets/cli/changelog","commit": false,"fixed": [],"linked": [],"access": "restricted","baseBranch": "main","updateInternalDependencies": "patch","ignore": []
}
commit
:为true
时,在执行change
和version
命令时,将自动执行提交代码操作fixed
:用于monorepo
中对包进行分组,相同分组中的包版本号将进行绑定,每次执行version
命令时,同一分组中的包只要有一个升级版本号,其他会一起升级。支持使用正则匹配包名称。linked
:和fixed
类似,也是对monorepo
中对包进行分组,但是每次执行version
命令时,只有和changeset
声明的变更相关的包才会升级版本号,同一分组的变更包的版本号将保持一致。支持使用正则匹配包名称。access
:如果配置为restricted
,将作为私有包发布,如果为public
,则发布公共范围包。baseBranch
:仓库主分支。该配置用于计算当前分支的变更包并进行分类。updateInternalDependencies
:用于声明更新内部依赖的版本号规则。当执行version
命令升级版本号时,默认会自动更新仓库中使用该包的依赖声明。配置该字段为minor
后,如果升级版本号为patch
类型,将不会自动更新引用依赖声明。changelog
:配置为false
时,执行version
命令时,在CHANGELOG.md
文件中只声明版本号,不声明其他Changelog
信息。ignore
:用于声明执行 version 命令时忽略的包,和version
命令的--ignore
参数用法一致,注意两者不能同时使用。
成changeset文件
一个 changeset
是个包含了在某个分支或者 commit
上改动信息的 md
文件,包含的内容包括:
- 本次变更涉及哪些包的变更。
- 本次变更需要升级的版本号类型,类型符合 semver (opens new window)规范。
- 本次变更的
Changelog
信息。
这个文件的本质是对包的版本和 Changelog
做一个预存储,我们也可以在这些文件中修改信息。
模块工程方案
在根目录执行 pnpm changeset add
,选择本次变更需要升级的版本号类型,填入 Changelog
信息,并点击两次回车,执行完成后,将在项目的 .changeset
目录创建对应的 changeset
文件
Monorepo 工程方案
在根目录执行 pnpm changeset add
,选择本次需要升级的包列表,分别选择不同版本类型对应的包,changeset
会询问版本号类型,如果存在包未选择这两种类型,将会默认使用 patch
类型,填入 Changelog
信息,并点击两次回车,执行完成后,将在项目的 .changeset
目录创建对应的 changeset
文件
提示
- 假设现在要进行迭代,我们从主分支上切一个分支出来,完成代码修改,如果需要变更记录,执行
pnpm changeset add
命令生成changeset
文件,最后提交代码。changeset
文件需要一并提交到远程仓库中。在后续的新版本发布后,这些changeset
文件是会被自动消耗掉的。
发布正式版本
修改版本号
pnpm changeset version
这会消费所有changeset,并根据这些changeset更新到最合适的 semver 版本。它还会为每个消费的changeset写入变更日志。 我们建议在此步骤中同时检查软件包的变更日志条目和版本变更。一旦您确信这些信息无误,并对变更日志进行了必要的调整,您就可以发布您的软件包了:
发布
pnpm changeset publish
changeset
会检查当前工作区中所有包的版本是否已经被发布过,如果没有则自动发布。
不需要发布的包可以在
package.json
中设置设置为私有包
{"private": true }
将 Changesets 与 Turborepo 一起使用
一旦你开始使用 Changesets,你将可以访问三个有用的命令
# Add a new changeset
changeset# Create new versions of packages
changeset version# Publish all changed packages to npm
changeset publish
将你的发布流程链接到 Turborepo 可以使组织你的部署更简单快捷。
我们的建议是将 Changesets 配置为自动提交 changeset version 的更改
{// …"commit": true// …
}
并在你的根 package.json 中添加一个 publish-packages 脚本
{"scripts": {// Include build, lint, test - all the things you need to run// before publishing"publish-packages": "turbo run build lint test && changeset version && changeset publish"}
如果你的包是公开的,请将 Changeset 的 access 设置为 public
{// …"access": "public"// …
}
我们推荐 publish-packages,这样它就不会与 npm 的内置 publish 脚本冲突。
这意味着当你运行 publish-packages 时,你的 monorepo 会被构建、linted、测试和发布 - 并且你将受益于 Turborepo 的所有加速功能。
npm publish发布到在线仓库时,提示:Scope not found
你也可以去除@ 不使用Scope包 注意不包名也不支持有大写名字
npm notice npm ERR! code E404 npm ERR! 404 Not Found - PUT https://registry.npmjs.org/@xxx%2fxxx - Scope not found npm ERR! 404 npm ERR! 404 '@xxx/xxx@0.0.0' is not in this registry. npm ERR! 404 You should bug the author to publish it (or use the name yourself!) npm ERR! 404 npm ERR! 404 Note that you can also install from a npm ERR! 404 tarball, folder, http url, or git url. npm ERR! A complete log of this run can be found in: npm ERR! C:\Users\Administrator\AppData\Local\npm-cache\_logs\2021-12-06T14_56_55_018Z-debug.log
这是由于包名是`@xxx/xxx`形式造成的。如果包名是`@`开头,需要到npm官网先创建一个组织。
**具体步骤如下:**
1. 注册`npm`官网账号,并且进入个人中心
2. 看到页面左侧菜单栏,点击后面的加号
3. 进入创建组织页面,输入组织名称。(这里不需要加上`@`符号)
如果组织名称已经存在页面会提示:
4. 再次执行`npm publish`命令,这是就可以正常发布。