lerna

关键字:lerna yarn workspace

lerna

lerna init

将一个仓库初始化为 lerna 仓库(默认固定模式)

lerna create 「package」

创建一个 package 到项目工程的 packages 下。

lerna add 「module」

  • 为每个 package 都安装指定依赖:
  lerna add react
  • 为指定的 package 安装特定依赖:
lerna add react-dom packages/package1 
// or 
lerna add react-dom --scope=package1
  • 添加依赖到根目录 node_modules 中:
npm install typescript -D
  • package 之间的相互依赖(会在 package/package.json 下添加该依赖):
lerna add package2 --scope package1 
// or 
lerna add package2 packages/package1

lerna publish

用于 npm 包版本发布

lerna bootstrap

用于将 packages 链接在一起(前提是相互依赖的库),并安装 package 下的依赖到 package/node_modules。

  • 注意,它不会安装根目录 package.json 的依赖,如果需要安装根目录依赖,请使用 npm install。

  • 参数:
    --hoist:依赖提升,把每个 package 下的依赖包都提升到工程根目录(删除包下的 node_modules,将依赖安装在根目录,但依赖注册不会在 package/package.json 内删除,也不会在 root/package.json 内添加此依赖)

lerna clean

删除各个包下的 node_modules(不会删除根目录 node_modules)。

lerna run 「script」

  • 运行每个包下面的 script(如果某个包没有此 script,将会报错)
lerna run test
  • 运行某个包下面的 script
lerna run test --scope package1

lerna link

链接互相引用的库,当 pakcage/package.json 内明确了 packages 下的包时,才会将相关包链接到 package/node_modules 中。

lerna info

查看 lerna 及运行环境的信息。

Lerna 最佳实践

lerna + yarm workspace 结合的 Monorepo 方案

  • yarn 处理依赖安装工作
  • lerna 处理发布流程

yarn workspace 管理工程

初始化工程时,需另做配置如下:

  • 1, 在 lerna.json 中声明使用 yarn workspace 进行依赖管理:
{
  ...
  "npmClient": "yarn",
  "useWorkspaces": true
}
  • 2, 在 root/package.json 下必需包含 workspaces 数组,与 lerna.json 下的 packages 保持一致:
{
  "private": true, // 工作空间不需要发布
  ...
  "workspaces": ["packages/*"]
}

yarn workspace 管理命令

  • 处理工程下指定的包模块时使用:yarn workspace;
  • 处理工程根目录全局或所有包模块时使用:yarn workspaces。

yarn install

代替 npm install + lerna bootstrap 安装工程依赖。
它与 lerna bootstarp 不同的是:

  • yarn install 会将 package 下的依赖统一安装到根目录之下。这有利于提升依赖的安装效率和不同 package 间的版本复用(有些包是需要私有依赖的,而私有依赖会被多个包安装多次,而提升依赖可以解决这一问题)。
  • yarn install 会自动帮助解决安装(包括根目录下的安装)和 packages link 问题。

yarn add 「module」

  • 为每个 package 都安装指定依赖:
yarn workspaces add react
  • 为指定的 package 安装特定依赖:
yarn workspace package1 add react react-dom --save

package1 一定是 packages/package1/package.json name 字段,有时候 package 的目录名和 name 字段不一致,要以 name 为准。

  • 添加依赖到根目录 node_modules 中:
cd 根目录 
yarn add @babel/core -D -W (-W 表示将依赖添加到 workspaces 根目录)
  • package 之间的相互依赖(会在 package/package.json 下添加该依赖):
yarn workspace package1 add package2

当 package2 没有发布在 npmjs 上时,此时会报错:package2 not found;解决办法:显示指定 package2 的版本: yarn workspace package1 add package2@^1.0.0

  • 在工程根目录下引入 packages/package 包:
yarn add package@^1.0.0 -W

yarn remove「module」

和上面 yarn add 命令格式相同,只需将 add 替换为 remove 即可。

yarn run 「script」

  • 运行工程根目录下 script:
yarn test
  • 运行指定包模块下的 script:
yarn workspace package1 run test

命令虽然是在根目录下执行,但在执行文件中拿到的 process.cwd() 是 package 下的执行文件所在路径

  • 运行所有 package 下的 script 命令:
yarn workspaces run test

如果某个 package 下没有对应 script,将会终止命令,并报错。

yarn workspaces info

查看 workspace 依赖树信息。

参考: [https://juejin.cn/post/7097820725301477406#heading-12]

你可能感兴趣的:(lerna)