Lerna 中文教程詳解

About

Lerna是一個工具,它優化了使用git和npm管理多包存儲庫的工做流。vue

vue,babel,react等都在用。我司也在用。文檔是英文,我便簡單總結一篇,但願對你們有幫助。node

工做的兩種模式

Fixed/Locked mode (default)

vue,babel都是用這種,在publish的時候,會在lerna.json文件裏面"version": "0.1.5",,依據這個號,進行增長,只選擇一次,其餘有改動的包自動更新版本號。react

Independent mode

lerna init --independent初始化項目。 lerna.json文件裏面"version": "independent",webpack

每次publish時,您都將獲得一個提示符,提示每一個已更改的包,以指定是補丁、次要更改、主要更改仍是自定義更改。git

Start init

$ npm install lerna -g
    $ mkdir lerna-gp && cd $_
    $ lerna init # 用的默認的固定模式,vue babel等都是這個
    
     # Add packages
    $ cd packages
    $ mkdir daybyday gpnode gpwebpack
    ...
    #分別進入三個目錄初始化成包
    $ cd daybyday
    $ npm init -y 
    $ cd ../gpnode
    $ npm init -y
    $ cd ../gpwebpack
    $ npm init -y
複製代碼

項目結構

➜  lerna-gp git:(master) ✗ tree
.
├── lerna.json
├── package.json
└── packages
    ├── daybyday
    │   └── package.json
    ├── gpnode
    │   └── package.json
    └── gpwebpack
        └── package.json

4 directories, 5 files
複製代碼

Set up

Set up git + npm

✗ 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
複製代碼

Set up yarn的workspaces模式

默認是npm, 並且每一個子package都有本身的node_modules,經過這樣設置後,只有頂層有一個node_modulesgithub

  • 修改頂層 package.json and lerna.json
# package.json 文件加入
 "private": true,
  "workspaces": [
    "packages/*"
  ],

# lerna.json 文件加入
"useWorkspaces": true,
"npmClient": "yarn",
  
複製代碼

Lerna Script

lerna create [loc]

建立一個包,name包名,loc 位置可選web

Examples

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

# 建立一個包gpnote指定放在 packages/@gp0320文件夾下,注意必須在workspaces先寫入packages/@gp0320,看上面
lerna create gpnote packages/@gp0320
複製代碼

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

增長本地或者遠程package作爲當前項目packages裏面的依賴npm

  • --dev devDependencies 替代 dependencies
  • --exact 安裝準確版本,就是安裝的包版本前面不帶^, Eg: "^2.20.0" ➜ "2.20.0"

Examples

# 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
複製代碼

lerna bootstrap

默認是npm i,由於咱們指定過yarn,so,run yarn install,會把全部包的依賴安裝到根node_modules.json

lerna list

列出全部的包,若是與你文夾裏面的不符,進入那個包運行yarn init -y解決bootstrap

➜  lerna-gp git:(master) ✗ lerna list
lerna notice cli v3.14.1
daybyday
gpnode
gpnote
gpwebpack
lerna success found 4 packages

複製代碼

lerna import

導入本地已經存在的包

lerna run

lerna run < script > -- [..args] # 運行全部包裏面的有這個script的命令
$ lerna run --scope my-component test
複製代碼

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
複製代碼

lerna link

項目包創建軟鏈,相似npm link

lerna clean

刪除全部包的node_modules目錄

lerna changed

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

原理: 須要先git add,git commit 提交。 而後內部會運行git diff --name-only v版本號,蒐集改動的包,就是下次要發佈的。並非網上人說的全部包都是同一個版全發佈。

➜  lerna-repo git:(master) ✗ lerna changed                                     
info cli using local version of lerna
lerna notice cli v3.14.1
lerna info Looking for changed packages since v0.1.4
daybyday #只改過這一個 那下次publish將只上傳這一個
lerna success found 1 package ready to publish

複製代碼

lerna publish

會打tag,上傳git,上傳npm。 若是你的包名是帶scope的例如:"name": "@gp0320/gpwebpack", 那須要在packages.json添加

"publishConfig": {
    "access": "public"
  },
複製代碼
lerna publish 
lerna info current version 0.1.4
#這句意思是查找從v0.1.4到如今改動過的包
lerna info Looking for changed packages since v0.1.4 

? Select a new version (currently 0.1.4) Patch (0.1.5)

Changes:
 - daybyday: 0.1.3 => 0.1.5 #只改動過一個

...

Successfully published:
 - daybyday@0.1.5
lerna success published 1 package
複製代碼
相關文章
相關標籤/搜索