lerna實踐

daly發表於2019-03-21

what's the lerna ?

A tool for managing JavaScript projects with multiple packages.
管理多模組JS專案的工具

What can Lerna do?

The two primary commands in Lerna are lerna bootstrap and lerna publish.
bootstrap will link dependencies in the repo together. publish will help publish any updated packages. 最初的兩個命令是lerna bootstraplerna publish
bootstrap會關聯倉庫內的依賴。publish會發布所有更新的包

practice

1.安裝並初始化目錄

// 全域性安裝
npm i lerna -g

// 建立實踐目錄
mkdir lerna-demo
cd lerna-demo
lerna init
複製程式碼

初始化之後,會自動掛鉤git,雖然還沒有倉庫

lerna實踐

安裝完畢之後,目錄如下:

lerna實踐

 - packages(目錄)
 - lerna.json(配置檔案)
 - package.json(工程描述檔案)
複製程式碼

2.建立一個包

mkdir module-1
cd module-1
npm init -y
複製程式碼

npm init -y 命令可以跳過輸入皮膚直接生成預設的package.json,日常專案中不要這樣用。

這是現在的檔案目錄

➜  lerna-demo git:(master) ✗ tree
.
├── lerna.json
├── package.json
└── packages
    └── module-1
        └── package.json

2 directories, 3 files
複製程式碼

3.給專案新增依賴

{
  "name": "module-1",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  // 這是新增的依賴
  "dependencies": {
    "lodash": "^4.17.4"
  }
}
複製程式碼

安裝依賴

lerna bootstrap
複製程式碼

lerna實踐
從輸出資訊可以看到,關聯了一個依賴包

4.上傳專案

你要現在git上新建一個倉庫,然後按照指令連結即可

echo "# lerna-demo" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/daly-young/lerna-demo.git
git push -u origin master
複製程式碼

倉庫連線上了,我們開始釋出吧

lerna publish
複製程式碼

選擇版本號

lerna實踐

我選了major,然後朝下走

lerna實踐
啊哦~報錯了~
報錯原因是根目錄的package.json沒有設定證照~所以我再重新設定下證照,每次加一個新包都會報這個問題,還是按照提示新增一個LICENSE.md檔案即可。

npm set init-license  ISC
複製程式碼

然後再重新發布一次

lerna實踐

沒問題,釋出成功

publish的大致過程是:

1.本地打個tag(例如git tag v1.0.0)

2.自動更新依賴項版本號 示例

3.然後把各個package釋出到npm

4.最後把tag和相應的commit給push上去

以上是lerna的常規建立釋出流程,預設模式是Fixed/Locked mode (固定模式)。

lerna mode

lerna提供Fixed/Locked mode(固定模式)和Independent mode(獨立模式) 這兩種模式的區別在哪呢?

Fixed/Locked mode

Fixed mode Lerna projects operate on a single version line. The version is kept in the lerna.json file at the root of your project under the version key. When you run lerna publish, if a module has been updated since the last time a release was made, it will be updated to the new version you're releasing. This means that you only publish a new version of a package when you need to.
This is the mode that Babel is currently using. Use this if you want to automatically tie all package versions together. One issue with this approach is that a major change in any package will result in all packages having a new major version.
固定模式的Lerna專案在單一版本線上執行。 該版本在根目錄的lerna.json檔案中進行版本管理。 當執行lerna publish時,如果自上次釋出版本以來有模組更新,則它將更新為您要釋出的新版本。 這意味著你只需在需要時釋出新版本的軟體包。
這是Babel目前使用的模式。 如果要自動將所有包版本繫結在一起,請使用此選項。 這種方法的一個問題是,任何包中的重大更改都將導致所有包都將升級新版本。

直接上程式碼執行試試吧~~

mkdir module-2
cd module-2
npm init
lerna bootstrap
複製程式碼

雖然我只加了一個包,但是顯示是關聯了兩個,這說明包括module-1的依賴包都重新關聯了一次

lerna實踐

然後我把這個包也釋出上去了
接著,我修改了module-2

touch index.js
vim index.js
複製程式碼

index.js

exports.demo = (param) => {
    console.log('hello ' + param)
}
複製程式碼

我還在依賴檔案裡新增了

"vuex": "^2.5.0"
複製程式碼

這樣的話,我算是有個重大修改,那麼這個版本號是我手動修改的呢?還是預設修改的呢? 還讓我手動修改就有點傻了~~所以我直接推送上去,然後lerna publish 果然,會讓我再次選擇版本號

lerna實踐

選擇之後,我們會發現

lerna實踐

無辜的module-1也更新了,lerna.json也更新了了版本號
這就是固定模式,我們瞭解了,一個更新,全體更新,這樣也不用擔心包之間相互依賴,版本不協調問題。 但是,如果存在很多package,一次改動就要疊加下版本號,總感覺這操作有點凶殘,所以我們看看第二種模式是不是有新的思路

Independent mode

這個模式初始化需要指定

lerna init --independent
複製程式碼

Independent mode Lerna projects allows maintainers to increment package versions independently of each other. Each time you publish, you will get a prompt for each package that has changed to specify if it's a patch, minor, major or custom change.
Independent mode allows you to more specifically update versions for each package and makes sense for a group of components. Combining this mode with something like semantic-release would make it less painful. (There is work on this already at atlassian/lerna-semantic-release). 獨立模式的Lerna專案允許維護人員相對獨立地增加包版本。 每次釋出時,你都會看到每個已更改的包的提示,以指定它是補丁,次要,主要還是自定義更改。
獨立模式允許您更具體地更新每個包的版本,並且只對一組元件有意義。 將這種模式與語義釋放(???)之類的相結合可以減少痛苦。 (在atlassian / lerna-semantic-release上已有相關工作)。

// 將lerna.json中的版本金鑰設定為獨立以在獨立模式下執行。
Set the version key in lerna.json to independent to run in independent mode.
複製程式碼

看起來這個是獨立的,互不影響,我們先來試驗一波~

重啟一個lerna專案,這裡不重複了,別忘了指定模式。 我們新建了module-1和module-2的包,並且已經發布成功了,OK,接下來我們修改module-2,依然是新增index.js,然後提釋出

lerna實踐

我改的是module-2,但是詢問我module-1的修改?

lerna實踐

然後詢問module-2?是不是我操作有誤?

不是,立馬再去查文件,發現是自己理解有誤,這個相對獨立並不是說我改了一個包就只發這個一個包,而是我改了一個包,可以具體制定其他包的版本,而不是像固定模式一樣,一個包升級大版本,所有包都升級大版本,這裡可以對每個包獨立定製版本。。原來是這個意思~~

那麼到這,兩種模式都實驗完畢~這只是簡單的操作,其他API(官方)大家可以再試試~~沒事記得給人家官方star一下~

參考文章:

lerna管理前端packages的最佳實踐
官方github

相關文章