Lerna 是一个使用 git 和 npm 优化多包存储库管理工作流的工具。
lerna仓库结构
my-lerna-repo/
package.json
packages/
package-1/
package.json
package-2/
package.json
Lerna 中的两个主要命令是lerna bootstrap
和lerna publish
。
bootstrap
将把仓库中的依赖项链接在一起。publish
将帮助发布任意的更新包。
一、安装
通过npm安装
npm i lerna -g
二、初始化
初始化的时候需在gitlub克隆空项目,在项目中执行初始化命令。
mkdir lernaDemo #创建目录文件夹,此目录应为git克隆下来的。
cd lernaDemo #进入文件夹
lerna init #初始化
初始化之后的目录文件应为
lernaDemo/
packages/
package.json
lerna.json
以下为配置文件设置
属性名 | 描述 |
---|---|
version | 当前版本 |
npmClient | 指定运行命令的客户端(也可以根据每个命令单独指定)。设定为"yarn" 则使用yarn 运行。默认值是"npm" |
command.publish.ignoreChanges | 通配符的数组,其中的值不会被 lerna 监测更改和发布。使用它可以防止因更改发布不必要的新版本,比如仅仅是修复 README.md 的错误。 |
command.publish.message | 执行发布版本更新时的自定义提交消息。更多细节见@lerna/version |
command.publish.registry | 使用它来设置要发布的自定义注册 url,而非 npmjs.org,如果需要的话,您必须经过授权。 |
command.bootstrap.ignore | 运行lerna bootstrap 指令时会忽视该字符串数组中的通配符匹配的文件。 |
command.bootstrap.npmClientArgs | 该字符串数组中的参数将在lerna bootstrap 命令期间直接传递给npm install 。 |
command.bootstrap.scope | 该通配符的数组会在lerna bootstrap 命令运行时限制影响的范围。 |
packages | 表示包位置的全局变量数组。 |
lerna.json
中的packages
配置是一个通配符列表,用于匹配包含了package.json
的的目录。这就是 lerna 识别“叶子”包(和“根”package.json
相对应,用于管理整个仓库的开发依赖和脚本)。
默认情况下,lerna 将包的列表初始化为["packages/*"]
,但是您也可以使用另一个目录,比如["modules/*"]
或["package1", "package2"]
。定义的通配符是相对于lerna.json
所在的目录的,该目录通常是存储库的更目录。唯一的限制是不能直接嵌套包的未知,但是该限制在“普通” npm 包中也是存在的。
三、新建项目打包发布
在packages中新建文件夹,通过npm init
来初始化项目,或者通过lerna create xxx
来新建项目。
###### 通过npm init 初始化项目
mkdir demo1
cd demo1
npm init -y
###### 通过lerna create 创建项目
lerna create demo1
✗ git remote add origin git@gitlab.yourSite.com:gaopo/lerna-gp.git
#查看是否登录
✗ npm whoami
gp0320
#没有则登录
npm login
# 输入username password
Logged in as gp0320 on https://registry.npmjs.org/. # succeed
设置完git和npm之后需要在packages
同级的package.json
中配置npm地址
{
"name": "root",
"private": true,
"devDependencies": {
"lerna": "^4.0.0"
},
"publishConfig": {
"registry": "http://localhost:4873"
}
}
修改完成git add .
和git commit -m "xx"
之后输入lerna changed
可以查看几个项目有改动。
wm0224@bogon mono % lerna changed
lerna notice cli v4.0.0
lerna info versioning independent
lerna info Looking for changed packages since demo1@1.0.2
demo1
demo2
lerna success found 2 packages ready to publish
执行lerna publish即可提交到git以及npm中,在这里提交有两种模式:
-
固定模式:packages中的所有项目版本保持一致,同时设置所有项目的版本号。
-
独立模式:在提交时可单独设置每个项目的版本。
将lerna.json
中的version
设置为independent
可以运行独立模式。
wm0224@bogon mono % lerna publish
lerna notice cli v4.0.0
lerna info versioning independent
lerna info Looking for changed packages since demo1@1.0.2
? Select a new version for demo1 (currently 1.0.2) (Use arrow keys)
❯ Patch (1.0.3)
Minor (1.1.0)
Major (2.0.0)
Prepatch (1.0.3-alpha.0)
Preminor (1.1.0-alpha.0)
Premajor (2.0.0-alpha.0)
Custom Prerelease
Custom Version
通过lerna publish
命令可以通过键盘上下键选择发布版本,也可以通过custom prerelease
来进行手动输入版本号。
上传完成之后可以在git上看到提交信息,并且已经发布到npm私服中。
四、引入已有项目
已有项目通过 lerna import 文件夹目录
进行引入,然后通过lerna bootstrap进行以来安装。
五、添加项目依赖以及安装项目中依赖
在项目中可用lerna bootstrap
来进行项目中需要的依赖安装。
lerna bootstrap
lerna notice cli v4.0.0
lerna info versioning independent
lerna info Bootstrapping 2 packages
lerna info Symlinking packages and binaries
lerna success Bootstrapped 2 packages
项目与项目之间的依赖可以用lerna add
指令进行添加。
lerna add demo1 --scope demo2 #在demo2中安装demo1依赖
lerna notice cli v4.0.0
lerna info versioning independent
lerna notice filter including "demo2"
lerna info filter [ 'demo2' ]
lerna info Adding demo1 in 1 package
lerna info Bootstrapping 2 packages
lerna info Symlinking packages and binaries
lerna success Bootstrapped 2 packages
六、下架版本
下架版本可以通过npm unpublish进行删除。
npm unpublish [<@scope>/]<pkg>@<version>
npm unpublish demo1 --force #demo1后面可接@版本号删除具体版本
npm WARN using --force I sure hope you know what you are doing.
- demo1
参考: