Lerna基础归纳

9,907 阅读2分钟

一、lerna是什么?

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

二、使用场景

在日常业务中,开发UI组件库、Util工具库以及插件库等场景

通常,我们在开发前端项目时都是单个包的,也就是只有一个package.json文件以及一个node_modules文件夹。单个包项目的优点不言而喻,简单,可靠,便于管理

但是,当一个大的项目库代码量剧增之后,管理起来就是一件比较麻烦的事情,为了方便代码的共享,就需要将代码库拆分成独立的包

当管理多个npm包时, 通常会遇到以下问题:

package之间相互依赖,开发人员需要在本地手动执行npm link,手动维护版本号的更替

发布繁琐, 多个package之间可能存在相互依赖, 多工程切换, 更新版本号

每一个package都包含独立的node_modules,而且大部分都包含babel,webpack等开发时依赖,安装耗时冗余并且占用过多空间

总结下,有几点优势:

  1. 自动解决packages之间的依赖关系
  2. 通过git 检测文件改动,自动发布
  3. 根据git 提交记录,自动生成CHANGELOG
  4. issue的集中管理,解决多包库的issue混乱痛点

缺点:

1. 当源码足够大的时候,repo体积较大;

2. 统一构建工具,对构建工具提出了更高要求,要能构建各种相关module

3. 代码集中管理,对多人协同工作要求更高


三、工作模式

Fixed/Locked mode (default)

vue,babel都是用这种,在publish的时候,会在lerna.json文件里面"version": "0.1.5",,依据这个号,进行增加,只选择一次,其他有改动的包自动更新版本号。


Independent mode

lerna init --independent初始化项目。 lerna.json文件里面"version": "independent",
每次publish时,您都将得到一个提示符,提示每个已更改的包,以指定是补丁、次要更改、主要更改还是自定义更改。


四、如何快速开始

# 全局安装lerna
$ npm install lerna -g
       
# 默认初始化lerna框架
$ lerna init 
       
# 在packages下创建文件夹daybyday
$ cd packages
$ mkdir daybyday
       
# 进入文件夹初始包
$ cd daybyday
$ yarn init
       
# 或者采用lerna指令创建文件夹并初始化
# lerna create  [loc]
$ lerna create gpnote 

可有项目结构:

PS G:\lerna\lerna-demo> tree /f
G:.
│  lerna.json
│  package.json
│
└─packages
    └─daybyday
            package.json


五、git配置

# 推送代码到远程库
git init
git add README.md
git commit -m "first commit"
git remote add origin git@github.com:fisher-zwl/lerna-demo.git
git push -u origin master

六、yarn的workspaces模式

默认是npm,而且每个子package都有自己的node_modules, 通过这样的设置后,只有顶层有一个node_modules。
  • 修改顶层package.json lerna.json

# package.json 文件加入
"private": true,
"workspaces": [
"packages/*"
],

# lerna.json 文件加入
"useWorkspaces": true,
"npmClient": "yarn",

七、指令详解

lerna create
[loc]

       创建一个包,name包名,loc 位置可选

# 根目录的package.json 
 "workspaces": [
    "packages/*",
    "packages/@gp0320/*"
  ],
  
# 创建一个包gpnote默认放在 workspaces[0]所指位置
lerna create gpnote 

# 创建一个包gpnote指定放在 packages/@gp0320文件夹下,
# 注意必须在workspaces先写入packages/@gp0320,看上面
lerna create gp packages/@gp0320

2. lerna add
[@version] [--dev] [--exact]

      增加本地或者远程package做为当前项目packages里面的依赖
  •  --dev devDependencies 替代 dependencies   
  • --exact 安装准确版本,就是安装的包版本前面不带^, Eg: "^2.20.0" ➜ "2.20.0"
  • # Adds the module-1 package to the packages in the 'prefix-' prefixed folders
    lerna add module-1 packages/prefix-*
    
    # Install module-1 to module-2
    lerna add module-1 --scope=module-2
    
    # Install module-1 to module-2 in devDependencies
    lerna add module-1 --scope=module-2 --dev
    
    # Install module-1 in all modules except module-1
    lerna add module-1
    
    # Install babel-core in all modules
    lerna add babel-core

3. lerna bootstrap

        默认是npm i,因为我们指定过yarn,so,run yarn install,会把所有包的依赖安装到根                node_modules.

4. lerna list

       列出所有的包,如果与你文夹里面的不符,进入那个包运行yarn init -y解决

PS G:\lerna\lerna-demo> lerna list
lerna notice cli v3.21.0
daybyday
react-image-preview
lerna success found 2 packages


5. lerna clean

      删除所有包的node_modules目录 

6. lerna changed

      列出下次发版lerna publish 要更新的包。

     原理:

            需要先git add,git commit 提交。

            然后内部会运行git diff --name-only v版本号 ,搜集改动的包,就是下次要发布的。              并不是所有包都是同一个版全发布。

PS G:\lerna\lerna-demo> lerna changed
lerna notice cli v3.21.0
lerna info Assuming all packages changed
daybyday
react-image-preview
lerna success found 2 packages ready to publish
# 俩个改过的包,下次发布publish将发布这俩个


7. lerna publish

       特点:会打tag,上传git,上传npm。

  •  如果你的包名是带scope的例如:"name": "@gp0320/gpwebpack",那需要在packages.json添加

"publishConfig": {
    "access": "public"
  },


8. lerna import

       导入本地已经存在的包  


9. lerna run

       运行某个包的某个指令

lerna run < script > -- [..args] # 运行所有包里面的有这个script的命令
$ lerna run --scope my-component test

10. lerna exec

       运行任意命令在每个包

$ lerna exec -- < command > [..args] # runs the command in all packages
$ lerna exec -- rm -rf ./node_modules
$ lerna exec -- protractor conf.js
lerna exec --scope my-component -- ls -la

11. lerna link

项目包建立软链,类似npm link
       

资料参考:

Lerna 中文教程详解

lerna的基础使用

lerna管理前端packages的最佳实践