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 规范)以及要添加到变更日志的变更信息。

本指南旨在帮助软件包维护者添加变更集。有关贡献者的信息,请参阅添加变更集

初始化后的整体工具应该会进入如下循环:

  1. 每次变更都会添加变更集
  2. 当发布准备就绪时运行版本命令,并验证更改
  3. 随后运行发布命令。

后两个步骤可以作为 CI 过程的一部分。

添加changesets

changesets 主要关心 monorepo 项目下子项目版本的更新、changelog 文件生成、包的发布。

pnpm add @changesets/cli -D
  • 在开发时,需要开发者提供本次变更涉及的包名称、升级版本类型(patchminormajor)及变更信息,即 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`命令,这是就可以正常发布。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端 贾公子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值