📯

02pnpm 工作空间

pnpm 工作空间:高效管理单体仓库

在现代软件开发中,单体仓库(Monorepo)结构越来越受到开发者的青睐。它允许多个项目或包共享同一个仓库,从而简化了依赖管理和代码共享。pnpm 是一个流行的包管理器,它通过工作空间(Workspace)功能,为单体仓库提供了强大的支持。本文将详细介绍 pnpm 工作空间的概念、配置和使用。

什么是 pnpm 工作空间?

pnpm 工作空间允许你在同一个仓库中管理多个包。这些包可以共享依赖、工具和配置,同时保持各自的独立性。通过使用 pnpm 工作空间,你可以在一个统一的地方安装和更新所有项目的依赖,而不是在每个项目的子目录中单独管理。

如何配置 pnpm 工作空间?

要启用 pnpm 工作空间,你需要在项目的根目录创建一个 pnpm-workspace.yaml 文件。这个文件定义了工作空间的根目录,并允许你包含或排除目录。例如:
packages: - 'packages/*' - '!packages/ignore-this-one'
在这个配置中,packages/* 表示包含 packages 目录下的所有直接子目录,而 !packages/ignore-this-one 表示排除 ignore-this-one 目录。

如何安装依赖?

在工作空间的根目录下运行 pnpm install 命令,pnpm 会自动安装所有子项目的依赖。这意味着你可以在一个统一的地方管理多个项目的依赖,而不是在每个项目的子目录中单独管理。

模块间的依赖如何管理?

如果工作空间中的一个包依赖于另一个包,你可以直接在 package.json 文件中声明这种依赖关系。pnpm 提供了 workspace: 协议来方便地实现子模块之间的相互依赖。例如:
{ "dependencies": { "@myorg/utils": "workspace:*" } }

执行脚本的统一操作

你可以在根目录的 package.json 文件中配置脚本,以便在所有工作空间中执行相同的操作。例如,你可以配置一个 dev 脚本来在所有子项目中运行开发服务器:
{ "scripts": { "dev": "pnpm -r dev" } }
这里的 -r 选项告诉 pnpm 在所有的子包中执行 dev 脚本。当你在根目录下运行 pnpm dev 时,pnpm 会自动在每个子包的 package.json 中查找 dev 脚本并执行它们。

发布包时的动态替换

在使用 pnpm 工作空间时,当你准备发布一个包时,pnpm 提供了一个非常有用的功能,即动态替换 workspace: 依赖。这个功能确保了在打包或发布过程中,所有使用 workspace: 协议声明的依赖项都会被替换为实际的版本号或者语义化版本范围(semver range)。
例如,当你在 package.json 中声明了如下依赖关系:
{ "dependencies": { "@myorg/utils": "workspace:*" } }
在执行 pnpm packpnpm publish 命令时,pnpm 会将这些依赖项动态替换为确切的版本号或语义化版本范围,例如 1.5.0^1.5.0
这个动态替换的过程允许你在本地开发环境中使用 workspace: 依赖,而在发布到远程仓库时,这些依赖会被转换为常规的版本依赖,这样其他开发者和项目就可以像使用普通包一样使用这些包,同时仍然受益于语义化版本控制。