跳到主要內容

傳統套件管理

在 lerna v7.0.0 中,我們在 lerna 中預設移除 lerna bootstrap、lerna add 和 lerna link 指令。

本節說明如何從不使用這些指令並改用套件管理員工作區進行現代化設定的最理想遷移方式。關於為何有此必要的完整語境,請參閱以下 背景

重要的思維轉變是意識到 lerna 並非負責在你的儲存庫中安裝和連結你的相依性,你的套件管理員更適合執行此任務。

達成此目的的方法是使用你的套件管理員的工作區功能。在此處查看其個別文件

透過使用工作區,你的套件管理員將執行 lerna bootstrap 和 lerna link 之前為你執行的相同確切連結,但此操作已內建於 install 指令中。執行 install 指令後,不必再執行其他指令(只要你已根據上述套件管理員文件設定工作區)。

替換 lerna add 也是同一個概念。新增和移除相依項是套件管理員已經可以執行的動作,而且由於 workspace 是首要使用案例,你可以執行適當的 install 指令,將相依項新增至特定套件/workspace,所有相關的本機連結也會自動進行。

針對更具體的比較,以及使用前和使用後的狀況,請見下方。

有什麼功能?

lerna bootstrap 用來取代 npm install(或 yarn/pnpm)。它會安裝所有外部套件,並連結 workspace 內部所有套件。lerna link 會執行此項操作的內部連結步驟。

在哪裡會找到它?

它很可能會出現在 workspace 根目錄下的 package.json「scripts」屬性中。你也可以檢查你的 CI 管線,因為它們可能會在 npm install(或 yarn/pnpm)的位置上呼叫 lerna bootstrap

要如何替換?

lerna bootstrap 替換為 npm install(或 yarn/pnpm)。如果你在工作流程中,呼叫 lerna bootstrap 之前已經執行過套件管理員安裝指令,那就直接刪除它。現在套件管理員會在 npm install 期間處理連結步驟,所以可以移除 lerna link

資訊

如果你使用 yarn,並依賴連結二進位檔案,那麼你可能需要在切換至 workspace 後,刪除 node_modules 資料夾一次。如需詳細資料,請參閱此個 yarn 議題

替換 lerna add 的使用

有什麼功能?

lerna add 用於新增相依項至 workspace 中的套件。它會更新各套件的 package.json 檔案,以新增相依項。

在哪裡會找到它?

meskipun通常手動呼叫,lerna add 仍然可能會出現在 workspace 根目錄下 package.json 中的某些指令碼中。

要如何替換?

lerna add 通常可以替換成 npm install(或 yarn/pnpm)的變體。lerna add 最常見的用途,是新增單一相依項至 workspace 內的單一套件。此指令如下所示

lerna add <dependency> --scope <package>

可以直接替換為

npm install <dependency> -w <package>

-w 標記告訴 npm 只在 <package> 所指定的 workspace 套件中安裝相依性,類似於 Lerna 的 --scope 選項。

如果您需要將相依性新增到多個套件中,則可以多次使用 -w 選項。

npm install <dependency> -w <package1> -w <package2>

自訂提升

lerna 舊有的 bootstrap 指令,它在提升或不提升某些相依性到 repo 的根目錄、或將它們留在嵌套位置中,提供了很好的控制,這也是它的優點之一。

因此,如果您在套件提升方面有相當自訂的設定,您可能會擔心遠離 lerna bootstrap

根據我們在測試各種套件管理員的經驗,我們發現新版的 yarn (即 v3 或更新版本) 在提升控制方面提供了最多的彈性。

https://yarn.dev.org.tw/configuration/yarnrc/#nmHoistingLimits

我們尚未找到一個由 lerna bootstrap 驅動的 repo,無論提升的複雜度如何,無法轉換為新版的 yarn,因此,如果您有此類問題,請務必試用看看。

如果您沒有任何進階的提升疑慮,僅使用 lerna bootstrap,則可以從任何套件管理員中進行選擇,它們都提供了強大的 工作區 實作。

暫時多重填補舊版的套件管理指令

如果您真的發現自己受困,並且在 v7 中需要 lerna bootstraplerna addlerna link 這些舊版的套件管理指令,您可以安裝與 lerna 套件版本相同的 @lerna/legacy-package-management 套件,這會以舊版的實作來多重填補這些指令。

重要的是要注意,這只是一個權宜之計,這個新套件可以被認為僅處於維護模式 - 舊版的套件管理問題(例如 lerna bootstraplerna addlerna link)將不會考慮任何新功能,我們只會著手合併關鍵的程式修正和安全性更新。

如果您處於這種情況,請在 lerna repo 上開啟議題,以便我們進一步了解您所面臨的困難並協助您找出解決辦法。

https://github.com/lerna/lerna/issues/new/choose

背景

Lerna 是 JavaScript 生態系統中原始的 monorepo/workspace 工具。它建立於 2015/2016 年,當時的生態系統看起來完全不同,而且沒有內建功能可以處理在單一存放庫(一個「工作區」)中使用多個套件。像 lerna bootstraplerna addlerna link 這類指令都是 lerna 專案的重要部分,因為沒有其他選項。

然而,事實上 - 多年來 - 我們所熟知和喜愛的套件管理員 (npmyarnpnpm) 都完全支援工作區作為一級使用案例的概念。

它們已經過實戰測試的實作,包括以自然的方式新增、移除和連結本機套件,以及將它們與第三方相依性結合在一起。

這就是為什麼在 Daniel 擔任 lerna 主要維護者的最後幾年中,一直強烈鼓勵大家重新考慮在 lerna 中使用舊版的套件管理指令,並改用套件管理員來發揮它們最擅長的功能。

我們早就知道這個背景,但作為 2022 年這個專案的新管理人員,我們不想直接開始,先不移除功能,並先花時間熟悉接近的實際狀況。現在經過我們一段時間積極維護,我們完全同意 Daniel 和其他人的意見,即 lerna 中舊有的套件管理指令需要移除。

透過移除這些舊的片段(原本就在套件管理員中另有更好的替代方案),我們和 lerna 社群的其他人現在就能專注於 lerna 獨特且有價值的部分(包含但不限於版本控管和發佈),並讓它們發揮最大的效益!

資訊

這個背景已在 Lerna v7 討論 中說明,如果您有任何疑慮,歡迎加入並提供您的資訊!