lerna 快速入门

multiRepo Vs monoRepo

image.png

lerna 简介

Lerna是一个用来优化托管在 git\npm 上的多 package 代码库的工作流的一个管理工具,可以让你在主项目下管理多个子项目,从而解决了多个包互相依赖,且发布时需要手动维护多个包的问题

  • 多仓库管理
  • 多包管理
  • 自动管理包依赖

lerna 常用命令

// 安装
npm i -g lerna

// 创建目录
mkdir lerna-repo && code lerna-repo

// 初始化
lerna init  // 默认fixed,包版本号统一管理
lerna init -i  // 独立模式,包版本单独管理

// 启动项目(如果项目是从git下载的,而不是第一次新建)
lerna bootstrap  // 安装所有packages的依赖项并且连接本地包的交叉依赖项
lerna bootstrap --hoist // 将各包中相同的依赖提取到根 node_modules, 最好先lerna clean删除各包依赖

// 创建package
// 也可以在packages目录下手动创建
lerna create <packageName> -y // 通过lerna 快速创建

// 安装依赖
// 将本地或者远程的包作为依赖项添加到当前的packages中,每次只能添加一个包
lerna add axios // 如果使用 Workspaces,各个包都安装一遍
lerna add axios --scope=<package-name> // 安装到指定的包中,--scope 指定需要安装的包名

// 删除所有包下面的node_modules目录,也可以删除指定包下面的node_modules。
// 注意: 不会删除package.json里面的依赖项定义,也不会删除root目录的node_modules
lerna clean
lerna clean --scope=<package-name>

// 列出所有公开的包(排除private=true的)
lerna list
lerna list --json // json形式

// 检查自上次发布以来有哪些包有更新
lerna changed

// 查看自上次发布以来的所有包或者指定包的git diff变化
lerna diff

// 在包含该脚本命令的每个package内部执行npm script脚本命令,也可以指定在某个package下执行
lerna run
lerna run build --scope=feu-ui

// 在每个包中执行任意命令,也可以指定在某个package下执行
lerna exec
lerna exec -- npm view \$LERNA_PACKAGE_NAME

// 将相互依赖的所有包Symlink链接在一起
lerna link

// 版本更新
lerna version

// 发布包
// 不会发布标记为私有(package.json中private=true)的包
// 代码必须先提交到 `git`
// 必须登录 `npm`
lerna publish

// 显示发布当前提交中标记的包,类似于先独立执行lerna version后,再执行此命令进行发布
lerna publish from-git

//显示发布npm registry中不存在的最新版本的包
lerna publish from-package

// 导入
// 将本地的包导入到指定目录
lerna import ~/Users/desktop --dest=package-name 
复制代码

设置yarn useWorkspaces

  • 默认是npm, 而且每个子package都有自己的node_modules,通过这样设置后,只有顶层有一个node_modules
  • 通过使用workspaceyarn install会自动的帮忙解决安装和link问题
yarn install # 等价于 lerna bootstrap --npm-client yarn --use-workspaces
复制代码

lerna.json

"npmClient": "yarn",  // 指定使用yarn,默认npm
"useWorkspaces": true  // 使用工作区域
复制代码

package.json

"workspaces": [
    "packages/*"
]
复制代码

lerna add axios

  • axios 安装到根目录的 node_modules
  • axios 依赖写入各包的 package.json

注意事项

  • lerna-repo 根目录是管理包的并不需要发布,lerna-repo、package.json 设置 "private": true
  • lerna-repo/packages 目录下才是需要发布的包,不需要发布的也设置 "private": true
  • 通过使用workspace,yarn install会自动的帮忙解决安装和link问题
  • 发布 @scope
// 在需要发布的子包下设置,而不是根目录的 package.json
{
 "name": "@vtian/package-name",
 "publishConfig": {
   "access": "publish" 	// 如果该模块需要发布,对于scope模块,需要设置为publish,否则需要权限验证
   // "registry": "https://[registry-url]" // 不要在子包中设置发布地址,在根目录的package.json中设置。会导致发布失败
  }
}
复制代码
  • 如果发布的是私仓,可能还需要配置
// .npmrc文件

egistry = https://[registry-url]
复制代码

lerna.json 完整配置文件

{
  "version": "1.1.3",
  "npmClient": "npm",
  "command": {
    "publish": {
      "ignoreChanges": ["ignored-file", "*.md"],
      "message": "chore(release): publish",
      "registry": "https://npm.pkg.github.com"
    },
    "bootstrap": {
      "ignore": "component-*",
      "npmClientArgs": ["--no-package-lock"]
    }
  },
  "packages": ["packages/*"]
}

复制代码

参数说明:

  • version 当前库的版本号,独立模式下,此参数设置为independent
  • npmClient 允许指定命令使用的client, 默认是npm, 可以设置成yarn
  • command.publish.ignoreChanges 可以指定那些目录或者文件的变更不会被publish
  • command.publish.message 指定发布时提交的消息格式
  • command.publish.registry 设置npm包发布的注册地址
  • command.bootstrap.ignore 设置执行lerna bootstrap安装依赖时不受影响的包
  • command.bootstrap.npmClientArgs 指定在执行lerna bootstrap命令时传递给npm install的参数
  • command.bootstrap.scope 指定那些包会受 lerna bootstrap 命令影响
  • packages 指定包所在目录

适用场景

  • 工具包
  • 公共ui组件库
  • 前端微服务项目

项目地址

lerna-repo

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享