学习 lerna

209 阅读4分钟

lerna

这个文章是笔者就自己学习lerna过程中的学习心得以及历程的一个分享的一个文章。同时作为一个记录,方便之后自己再次使用的时候查找记录。

前言

目前的工程化仓库管理模式主要有两种: monorepomultirepo

  • multirepo

    该种模式主要是通过不同的独立的代码仓库进行管理。

  • monorepo

    该种模式主要是通过一个单独的代码仓库,将不同的

lerna简介

Lerna 是一个管理工具,用于管理包含多个软件包(package)的 JavaScript 项目。(官网自己的介绍)

初始化项目

全局安装

npm install --global lerna

初始化 git 代码

git init lerna-repo && cd lerna-repo
复制代码

初始化 Lerna

lerna init
// lerna info Creating package.json 
// lerna info Creating lerna.json 
// lerna info Creating packages directory 
// lerna success Initialized Lerna files

此时得到了这样一个仓库目录结构:

lerna-repo/ 
    packages/ 
    package.json 
    lerna.json

其中 packages 中保存着每个独立的包模块。

安装 lerna 到仓库 node_modules 中:

npm install

至此,我们就完成了一个 Lerna 工程的初始化工作,下面我们掌握一些操作命令来管理 Lerna。

Lerna 管理命令

可查看官方文档: lerna.js.org/docs/api-re…

lerna init

将一个仓库初始化为 lerna 仓库

lerna init
lerna init --independent/-i – 使用独立的版本控制模式

lerna create 「package」

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

lerna create package-1

lerna add 「module」

为指定的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 publish  
# lerna version + lerna publish from-git 
# lerna version 是去读取 lerna.json 中的 version 值
lerna publish from-git 
# 发布当前 commit 中打上 annoted tag version 的包
lerna publish from-packages 
# 发布 package 中 pkg.json 上的 version 在 registry(高于 latest version)不存在的包

lerna bootstrap

将 packages 链接在一起,同时安装 package 下的依赖到 package/node_modules

lerna add时也发现了,为某个 package 安装的包被放到了这个 package 目录下的 node_modules 目录下。这样对于多个 package 都依赖的包,会被多个 package 安装多次,并且每个 package 下都维护 node_modules ,也不清爽。于是我们使用 --hoist 来把每个 package 下的依赖包都提升到工程根目录,来降低安装以及管理的成本

lerna bootstrap --hoist

为了省去每次都输入 --hoist 参数的麻烦,可以在 lerna.json 配置:

{
  "command": {
    "bootstrap": {
      "hoist": true
    }
  },
}

lerna clean

删除各个包下的 node_modules

lerna ls

列出当前 Lerna 仓库中的所有公共软件包(public packages)

lerna run 「script」

运行包下面的script

lerna run test
lerna run test --scope package1 // 具体某个包下面的

lerna exec 「script」

允许去执行 shell 脚本

lerna exec webpack

lerna changed

检查自上次发布以来哪些软件包被修改过。

lerna link

链接互相引用的库

lerna info

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

Lerna 配置文件

在 lerna.json 配置文件内可以指定工作模式、packages 的位置以及一些命令的默认参数定义,如下示例:

{
  "version": "1.0.0", // 当前仓库的版本,Independent mode 请设置为 independent;
  "npmClient": "yarn", // 允许指定命令使用的client, 默认是 npm, 可以设置成 yarn;
  "useWorkspaces": true, // 使用 yarn workspaces 管理 Monorepo;
  "packages": [ // 指定包所在的目录,支持指定多个目录;
    "packages/*"
  ],
  "command": {
    "bootstrap": {
      "npmClientArgs": [ // 指定默认传给 lerna bootstrap 命令的参数
        "--no-package-lock"
      ]
    },
    "version": {},
    "publish": {
      "npmClient": "npm",
      "ignoreChanges": [ // 指定那些目录或者文件的变更不用触发 package 版本的变更;
        "**/*.md",
        "**/test/**"
      ],
      "message": "chore(release): publish", // 执行发布版本更新时的生成的 commit message;
      "registry": "https://registry.npmjs.org", // 指定发布到的 registry url,比如可以发布到指定私服,默认是 npmjs.org;
      "conventionalCommits": true // lerna version 将生成 CHANGELOG.md files(如果设置了这个,lerna 管理模式将直接使用固定模式,version = independent 的配置将失效)。
    }
  }
} 

报错集合

lerna publish的时候产生的错误

1. lerna ERR! fatal: tag 'v0.0.2' already exists

本地的git有打了 v0.0.2的标签

2. lerna ERR! E404 Scope not found

需要在npm的项目中organization添加一个组织

juejin.cn/post/704435…

参考文章: