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

背景

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

pnpm 和 monorepo

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

pnpm文档:https://www.pnpm.cn/workspaces

changeset

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

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

准备

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

1. 创建文件夹

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

mkdir my-monorepo

2. 项目初始化

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

cd my-monorepo
   pnpm init

3. 构建 monorepo

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

# pnpm-workspace.yaml
packages:
  - "apps/*"
  - "packages/*"
  - "!**/test/**"

4. 创建包文件夹

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

    mkdir packages

5. 创建子项目

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

    cd packages
   mkdir my-package-one

6. 子项目初始化

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

    cd my-package-one
   pnpm init

7. 构建多项目

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

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

image.png

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

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

使用

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

安装 changesets

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

  # 安装 changesets
  pnpm add -Dw @changesets/cli

然后changesets的初始命令:

  # 初始化 changesets 文件夹
  npx changeset init

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

|-- my-monorepo
    |-- .changeset
        |-- config.json
        |-- README.md
    |-- ...

配置 changestes

配置 .changeset/config.json

配置文档:https://github.com/changesets/changesets/blob/main/docs/config-file-options.md

默认配置,如下:

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

修改 packages.json

修改项目根目录的 package.json

// 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执行,下面的命令:

pnpm changeset

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

效果如下:

image.png

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

image.png

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

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

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

{
    - "version": "1.0.0",
    + "version": "2.0.0",
}

说明

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

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

image.png

总结

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

Q&A

文章写到这里基本结束了,简单回顾下文章的内容。

  • Q: 有源码吗?

当然有,地址如下:https://github.com/027xiguapi/pear-rec,有兴趣的话可以大家一起探讨,同时也欢迎大家forkstar

  • 27
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值