# HowTo Lerna

# Lerna 和 yarn 结合使用(最佳实践)

# 安装依赖

npm i -g lerna yarn

# 初始化项目

mkdir lerna-repo && cd $_

npx lerna init --independent

# 设置 yarn workspace

设置package.json

{
  "name": "root",
  "private": true,
  "workspaces": [
    "packages/*"
  ],
}

设置lerna.json

{
  "command": {
    "bootstrap": {
      /* 此模式:当多个包有相同依赖时会提升到顶层的node_modules,避免重复安装,减少体积 */
      "hoist": true,
      /* 在bootstrap期间,将参数传递给 npm install */
      "npmClientArgs": ["--no-package-lock", "--no-ci"]
    },
  },
  /* 使用yarn运行所有命令 */
  "npmClient": "yarn",
  /* 使用yarn的工作区(需在package.json中指定workspaces) */
  "useWorkspaces": true,
  /* 独立模式:该模式下只有改动过的 package 才会被发布,每次发布时,都会提示您已更改的每个软件包,以指定是补丁,次要,主要还是自定义更改,注意:使用约定式提交后,会根据commit生成对应版本,无需手动指定 */
  "version": "independent"
}

# 安装依赖

  1. 安装所有依赖(bootstrap)
# --npm-client=yarn --hoist 会冲突
# 用 yarn workspace 特性替代 lerna bootstrap

$ yarn
  1. 根项目安装依赖
# yarn 使用 workspace 模式安装 npm 包时必须加 -W 参数
$ yarn add -D -W lodash
  1. 给 package 安装外部依赖
yarn workspace @sialvsic/xxx add lodash
  1. 给 package 安装内部依赖
# 一定要指定正确的版本号,不然会到npm查找包
$ yarn workspace @sialvsic/xxx add @sialvsic/xxx@1.0.0

# 清除依赖

$ lerna clean && rm -rf ./node_modules

# 运行命令

# lerna run [...cmd] --scope @scope
$ lerna run compile --scope @ndogkit/shared-utils

# 发布

# 查看更改,同样 package.json 中设置了 "private": true 的 package 不会展示
$ lerna changed
# 每次发布会自动更新相关package的版本号,并且会更新引用该package的其他package依赖
$ lerna publish

# 参考

  1. Lerna + yarn 实现 monorepo 管理 (opens new window)
陕ICP备20004732号-3