在公司项目中使用changesets进行项目管理,提升效率

背景

在公司的Monorepo项目管理中,版本管理一直是一个比较难处理的问题,今天我就介绍用changesets来进行版本控制、版本变更和发布。 在现代软件开发中,Monorepo架构已经成为管理复杂项目的流行选择。它允许我们将多个相关项目或模块集中在一个单一的代码库中。对于使用pnpm monorepo的项目来说,使用changeset可以提供更高效、更可靠的版本控制和发布管理。

pnpm 和 monorepo

首先,让我们来了解一下pnpm monorepopnpm是一个快速、可扩展的包管理工具,它允许我们在一个根目录下同时管理多个相关项目。这种架构提供了更好的代码共享和依赖管理,以提高开发效率和代码质量。

pnpm文档:www.pnpm.cn/workspaces

changeset

接下来,让我们了解一下changesetchangeset是一个轻量级的版本控制工具,它主要用于管理项目中的版本变更和发布。使用changeset,我们可以定义项目中的变更,并生成适用于每个变更的语义化版本号。这样,我们就可以更好地控制和维护项目的版本历史,确保依赖关系的兼容性和代码库的稳定性。

changesets文档:github.com/changesets/...

准备

pnpm monorepo的项目中使用changeset,首先我们要有一个monorepo的项目。使用pnpm创建monorepo项目,具体的可以看我写的这篇文章------《简单讲解怎么用pnpm搭建一个monorepo开源react项目(Vite 和 TypeScript)》,也可以按照以下步骤进行操作:

1. 创建文件夹

创建一个空文件夹作为根目录。例如,可以执行以下命令在当前目录下创建一个名为my-monorepo的文件夹:

perl 复制代码
mkdir my-monorepo

2. 项目初始化

进入根目录,执行以下命令来初始化pnpm monorepo项目:

bash 复制代码
cd my-monorepo
   pnpm init

3. 构建 monorepo

新建pnpm-workspace.yaml文件。执行以下命令:

makefile 复制代码
# pnpm-workspace.yaml
packages:
  - "apps/*"
  - "packages/*"
  - "!**/test/**"

4. 创建包文件夹

创建一个名为packages的文件夹,该文件夹将用于存放所有子项目。执行以下命令:

arduino 复制代码
    mkdir packages

5. 创建子项目

进入packages文件夹,创建子项目的文件夹。每个子项目都可以是一个独立的模块。例如,可以执行以下命令来创建一个名为my-package的子项目:

perl 复制代码
    cd packages
   mkdir my-package-one

6. 子项目初始化

进入子项目的文件夹,执行以下命令来初始化子项目:

kotlin 复制代码
    cd my-package-one
   pnpm init

7. 构建多项目

重复步骤5至6,以创建和初始化其他子项目。

现在,你已经成功创建了一个pnpm monorepo项目,并在根目录下创建了子项目文件夹。每个子项目都可以拥有自己的独立依赖项并进行单独的开发。最后完整项目如下图:

需要注意的是,在根目录下运行pnpm的命令时,它会根据每个子项目的依赖关系自动安装和管理依赖项。这使得依赖项的复用更加高效,并确保所有子项目共享同一版本的依赖项。

通过使用pnpm创建monorepo项目,我们可以更好地管理和维护多个相关项目,并提高开发效率和代码质量。每个子项目都可以独立于其他项目进行开发,同时共享相同的依赖项和版本控制。这种集中式的代码管理方式为团队协作提供了更好的灵活性和可扩展性。

使用

pnpm monorepo的项目中使用changeset,我们可以按照以下步骤进行操作

安装 changesets

要在 pnpm 工作区上设置变更集,请将变更集作为开发依赖项安装在工作区的根目录中

js 复制代码
  # 安装 changesets
  pnpm add -Dw @changesets/cli

然后changesets的初始命令:

csharp 复制代码
  # 初始化 changesets 文件夹
  npx changeset init

完成后项目会出现一个.changeset的文件夹

lua 复制代码
|-- my-monorepo
    |-- .changeset
        |-- config.json
        |-- README.md
    |-- ...

配置 changestes

配置 .changeset/config.json

配置文档:github.com/changesets/...

默认配置,如下:

json 复制代码
{
  "commit": false,
  "updateInternalDependencies": "patch",
  "linked": [],
  "access": "restricted",
  "baseBranch": "master",
  "ignore": [],
  "changelog": "@changesets/cli/changelog"
}

修改 packages.json

修改项目根目录的 package.json

js 复制代码
// package.json

// 新增
"scripts": {
    // 构建整个项目的产物
    "build": "pnpm -r --filter ./packages run build",
    // 1. 开始交互式填写变更集
    "changeset": "changeset",
    // 2. 用来统一提升版本号
    "vp": "changeset version",
    // 3. 构建产物后发版
    "release": "pnpm build && pnpm release:only",
    "release:only": "changeset publish --registry=https://registry.npmjs.com/"
}

执行命令

  1. 开始交互式填写变更集

我是win10的电脑可以,打开windows powershell执行,下面的命令:

js 复制代码
pnpm changeset

注意:git 不行,因为无法使用键盘选择。

效果如下:

选择完要提交的包,之后写入Summary,如下图:

操作完之后.changeset的文件内就会多一个*.md文件。

  1. 统一提升版本号 完成上面的操作后,再统一提升版本号,使用下面的命令:
js 复制代码
pnpm vp

操作完之后子项目的文件内就会多一个CHANGELOG.md文件,并且package.json文件的项目版本也会提升。

js 复制代码
{
    - "version": "1.0.0",
    + "version": "2.0.0",
}

说明

业务项目发布流是怎么样的?

  • 不同开发者先开发,在提交 PR 时使用 pnpm changeset 写入一份变更集。
  • 定期项目 owner 发包,使用 pnpm vp 消耗所有变更集,由 changesets 自动提升子包版本、生成 changelog
  • 执行 pnpm release 构建全部项目并发包。

总结

总之,在pnpm monorepo的项目中使用changeset是一种高效、规范的版本控制和发布管理方法。它可以帮助开发者更好地管理包之间的依赖关系,并提供更可靠的代码库维护和版本历史追踪。通过结合pnpm monorepochangeset,我们可以更高效地构建和维护复杂的软件项目。

相关推荐
也无晴也无风雨1 小时前
深入剖析输入URL按下回车,浏览器做了什么
前端·后端·计算机网络
Martin -Tang2 小时前
Vue 3 中,ref 和 reactive的区别
前端·javascript·vue.js
FakeOccupational3 小时前
nodejs 020: React语法规则 props和state
前端·javascript·react.js
放逐者-保持本心,方可放逐3 小时前
react 组件应用
开发语言·前端·javascript·react.js·前端框架
曹天骄4 小时前
next中服务端组件共享接口数据
前端·javascript·react.js
阮少年、5 小时前
java后台生成模拟聊天截图并返回给前端
java·开发语言·前端
郝晨妤6 小时前
鸿蒙ArkTS和TS有什么区别?
前端·javascript·typescript·鸿蒙
AvatarGiser6 小时前
《ElementPlus 与 ElementUI 差异集合》Icon 图标 More 差异说明
前端·vue.js·elementui
喝旺仔la6 小时前
vue的样式知识点
前端·javascript·vue.js
别忘了微笑_cuicui6 小时前
elementUI中2个日期组件实现开始时间、结束时间(禁用日期面板、控制开始时间不能超过结束时间的时分秒)实现方案
前端·javascript·elementui