跳至主要內容

版本和發佈

Lerna 可以遞增您的套件版本,也可以將您的套件發佈到 NPM,它提供各種選項以確保可以容納任何工作流程。

為了顯示 Lerna 如何執行,我們將查看 這個儲存庫

如果您透過實際操作學習得更好,請複製儲存庫並繼續執行。

這個儲存庫包含三個套件或專案:

  • header(React 元件的程式庫)
  • footer(React 元件的程式庫)
  • remixapp(使用 Remix 架構編寫的應用程式,依賴於 headerfooter

我們將公佈 headerfooter 套件。

通常只公佈部分專案。有些專案可能是私人專案(例如,僅用於測試),有些可能是展示應用程式。在此儲存庫中,remixapp 在意義上並非「私人」,並不是不希望人們看到原始檔案,而是僅在 package.json 檔案中使用 "private": true 設定,以避免公佈到 NPM。

版本控制

Lerna 附帶一個 version 指令,讓您可以遞增套件的版本號碼、提交變更並相應標記。

lerna version --no-private

您將獲得以下輸出

lerna notice cli v5.1.2
lerna info current version 1.0.0
lerna info Assuming all packages changed
? Select a new version (currently 1.0.0) (Use arrow keys)
❯ Patch (1.0.1)
Minor (1.1.0)
Major (2.0.0)
Prepatch (1.0.1-alpha.0)
Preminor (1.1.0-alpha.0)
Premajor (2.0.0-alpha.0)
Custom Prerelease
Custom Version
資訊

請注意,通過傳遞 --no-private,我們排除了所有在其 package.json 檔案中標記為 private 的套件。

Lerna 會偵測目前的套件,識別目前的版本並提出下一個可選擇的版本。請注意,您也可以直接傳送 semver 調整版本,例如 lerna version 1.0.0。有關更詳細的說明,請參閱 版本文件說明。一旦選擇給定版本,Lerna 便會更新包含版本號碼的 package.json,提交變更、新增對應的版本標籤(例如 v1.0.0),然後將提交和標籤推送到遠端儲存庫。

packages/footer/package.json
{
"name": "footer",
"version": "1.0.1",
"main": "dist/index.js",
...
}

請注意,上述操作並不會將套件推送到任何 NPM 儲存庫。如果我們還希望 Lerna 負責發布程序,則可以用 lerna publish 取代它。

資訊

Lerna 使用 lerna.json 中的 version 屬性來確定目前使用的版本

發布到 NPM

如果我們執行

lerna publish --no-private

Lerna 會執行版本遞增工作流程(與 lerna version 相同),並且還會將套件推送到 NPM。您應取得下列輸出

終端機輸出
lerna notice cli v5.1.2
lerna info current version 1.0.0
lerna info Assuming all packages changed
? Select a new version (currently 1.0.0) Patch (1.0.1)

Changes:
- footer: 1.0.0 => 1.0.1
- header: 1.0.0 => 1.0.1

? Are you sure you want to publish these packages? Yes
lerna info execute Skipping releases
lerna info git Pushing tags...
lerna info publish Publishing packages to npm...
...
lerna success published header 1.0.1
...
lerna success published footer 1.0.1
...
Successfully published:
- footer@1.0.1
- header@1.0.1
lerna success published 2 packages

from-package

Lerna 可以透過 from-package 找出另一個可發布的套件。Lerna 會將儲存庫中每個套件的版本與發布到 npm 的版本進行比較。對於版本大於已發布版本的每個套件,Lerna 都會將該套件發布到 npm。

此模式並不要求必須使用 lerna version 來對套件進行版本化,這非常適合有自己的版本化腳本的工作區。

lerna publish from-package
資訊

Lerna 一向 使用 npm 來發布套件。如果您使用的套件管理員並非 npm,則仍需將適當的發布組態新增到 .npmrc,即使在 lerna.jsonnpmClient 已設定為 npm 以外的選項也不例外。

版本化策略

Lerna 讓您能使用兩種模式之一來管理專案:固定或獨立。

固定/鎖定模式(預設)

固定模式 Lerna 專案會在單一版本行上運作。版本保留在專案根目錄下的 lerna.json 檔案中 version 鍵底下。執行 lerna publish 時,如果某個套件自上次發布以來已更新,該套件將更新至您正在發布的新版本。這表示您只有在需要時才會發布套件的新版本。

注意:如果您有一個主要版本零,則所有更新都被 視為破壞性。因此,如果以主要版本零執行 lerna publish,並選取任何非預發行版本號,則會為所有套件發布新版本,即使自上次發布以來並非所有套件都有變更。

如果您想自動將所有套件版本連結在一起,可以使用這個方法。此作法的一個問題是任何套件的重大變更都會導致所有套件都變成新的主要版本。

同步化版本

Lerna 只會替自上次發行後已變更的套件編寫版本並發布,因而造成套件版本會逐漸偏離。若要防止這種情況發生,請將 --force-publish 選項與 lerna version 搭配使用。這會強制 Lerna 無論套件自上次發行後是否已變更,都產生所有套件的版本。然後,這些套件都會由 lerna publish from-git 發布到註冊表中。因此,所有套件版本會與 lerna.json 中的版本保持同步。

獨立模式

npx lerna init --independent

獨立模式的 Lerna 專案允許維護人員獨立提升各套件的版本。每次發布時,您都會收到變更的每個套件的提示,以指定變更為程式碼修正、次要變更、主要變更或自訂變更。

獨立模式讓您能更具體地更新每個套件的版本,並更適用於元件群組。將此模式與 語意化發布 這種方法結合,會降低麻煩程度。(目前已有 atlassian/lerna-semantic-release 正在研究這項功能)。

lerna.json 中的 version 鍵設定為 independent,即可執行獨立模式。