使用lerna + yarn workspace搭建mono-repos工程

3,147 阅读2分钟

创建

安装lerna、yarn,初始化工程

npm i lerna yarn -g
git init mono-repos && cd mono-repos && yarn add lerna -D && lerna init

配置root目录package.json

/* /package.json */
{
  "name": "root",
  "private": true, // root库作为packages管理角色不需要发布到npm
  "devDependencies": {
    "lerna": "^4.0.0"
  },
  "workspaces": [ //开启Yarn workspaces
    "packages/*"
  ]
}

配置lerna.json

/* /lerna.json */
{
  "packages": [
    "packages/*"
  ],
  "version": "independent",  // 独立版本号模式,每个package维护各自的版本号,默认为fix模式
  "npmClient": "yarn",  // 依赖管理工具,默认为npm
  "useWorkspaces": true // 开启workspaces模式
}

依赖管理

常用命令

// 全局安装依赖
yarn install
// 为某个package添加、删除依赖
yarn workspace <package-name> [add|remove] <library> [-D|-S]
// 其他请自行查阅官网

hoist功能

  • 当使用lerna + yarn workspace时,lerna的--hoist会被禁用,我们直接使用yarn install即可实现相同功能。
mkdir -p packages/sub-package-1/src/index.js && cd packages/sub-package-1 && npm init -y
cd -
mkdir -p packages/sub-package-2/src/index.js && cd packages/sub-package-2 && npm init -y
  • 在sub-package-1、sub-package-1中安装pretty-format,该依赖会被放在对应package的node_modules中。
  • 再执行yarn install,2个包中相同的pretty-format会被提升到root的node_modules中。
yarn workspace sub-package-1 add -D pretty-format
yarn workspace sub-package-2 add -D pretty-format
yarn install

版本发布

  • 版本发布完全由lerna进行管理,除此之外lerna也补充一些yarn依赖管理的不足。
  • lerna:github.com/lerna/lerna

常用命令

lerna exec       // 在每个包中执行任意命令
lerna changed    // 检查自上次发布以来哪些软件包已经更新
lerna diff       // 自上次发布以来,对所有包或单个包进行区分
lerna publish    // 发布版本
lerna clean      // 清除项目中所有 node_modules
lerna init       // 初始化项目
lerna create     // 创建项目中的子package
lerna run        // 在包含该脚本的包中运行 npm 脚本

尝试发布一个包

  • 首先,提交代码到仓库,并登陆npm库。
npm login
  • 配置子工程package.json
/* /packages/subsub-package-1/package.json */
/* /packages/subsub-package-2/package.json */
{
  "name": "sub-package-1", // or sub-package-2
  "version": "1.0.0",
  "main": "src/index.js",
  "scripts": {
    "test": "echo "Error: no test specified" && exit 1"
  },
  "repository": { // 设置仓库地址
    "type": "git",
    "url": "https://xxx.com/xxx/xxx.git"
  },
  "publishConfig": {
    "access": "public" // 不花钱发布以@开头的包时需要设置为public
  }
}
  • 发布
lerna publish
  • 以上是对lerna + yarn workspace搭建的mono-ropos工程基本使用,接下来有新的发现再更新。

可能遇到的问题

  • 当没有提交代码发布失败后,提交代码再次发布不会更新到npm仓库,这种情况可以使用以下方式提交。
lerna publish from-package // 对比npm仓库中包版本是否与本地一致,不一致则发布到npm库
lerna publish from-git // 把当前tag中涉及的NPM包再发布一次,不会再更新package.json

参考

zhuanlan.zhihu.com/p/108118011

zhuanlan.zhihu.com/p/372889162