源自 | The npm Blog譯者 | 王強編輯 | Yonienpm 存在的問題從架構的角度來看,將大型單體代碼庫拆分爲較小的、獨立封裝的一系列模塊一般是個好方法。從微服務到可複用組件庫,不少技術都很適合模塊化。但從版本發佈和源代碼管理的角度來看,它也多是一場噩夢。git
包之間的依賴項重複會大大增長安裝依賴項所需的時間。一些生態系統(特別是 npm)是高度模塊化的。模塊化會鼓勵複用,但也意味着某些包可能在你開發的每一個包裏都複製了一份。github
Monorepo 是針對這個問題的流行解決方案。它意味着你會將全部模塊放在同一個代碼存儲庫中,而不是每一個模塊配一個代碼存儲庫。而後開發者在開發應用時只用這個「monorepo」就夠了。因爲所需的內容都放在了一塊兒,發現、訪問控制和版本控制工做都變得更加簡單。數據庫
顯然,代價就是你只能對全部代碼作總體權限控制。但若是你能接受這一點,monorepo 就能在兼顧模塊化全部優點的前提下提供很是簡單的源代碼管理方法。npm
那麼 monorepo 怎樣搭配 npm 使用呢?最受歡迎的兩大解決方案分別是 Yarn workspaces 和 lerna。因爲 lerna 支持 npm,讓咱們來看看它是如何實現 monorepo 的。編程
首先咱們全局安裝 lerna。json
$ npm install -g lerna
接下來,咱們須要建立新的 lerna 存儲庫:微信
$ mkdir monorepo_example
$ cd monorepo_example
$ lerna init
查看 lerna.json 能夠看到版本和包的定義位置。架構
$ cat lerna.json
{
「packages」: [
「packages/*」
],
「version」: 「0.0.0」
}
如上所示,咱們的 monorepo 中全部包的版本都是 0.0.0。可是咱們的 monorepo 中尚未任何包。在咱們添加包以前應該先登陸到咱們的存儲庫,以便 lerna 在每一個新包上正確設置 publishConfig。ide
若是你要發佈在公共 npm 存儲庫以外的位置上(例如 npm Enterprise),則首先須要設置你的存儲庫。模塊化
$ npm config set registry https://registry.npm.yourcompany.com
接下來,咱們用具備發佈權限的用戶登陸到存儲庫中。若是你的包沒有做用域,則能夠省略 -scope 標誌。
$ npm login -scope test
如今爲咱們的 monorepo 添加一些定域包(scoped package)。
$ lerna create @ test / a
$ lerna create @ test / b
$ lerna create @ test / c
若是你爲每一個包選擇了默認設置,那麼如今測試域內會有三個包(a、b、c),版本爲 0.0.0。在更新版本以前,咱們須要提交已完成的工做的併爲 git 建立一個遠程鏈接:
$ git add。
$ git commit -m 「Initial commit」
$ git remote add origin git@github.com:username/reponame.git
$ git push -u origin master
如今咱們可使用一個命令來更新全部包的版本。
$ lerna version major
此命令不只會將每一個包都更新到 1.0.0,還會爲你推送版本更新到 git。最後一步是將這些包發佈到 npm。Lerna 用一個命令就能完成這個任務。
$ lerna publish from-git
這條命令成功運行後,你就成功將第一個 monorepo 中的全部包都發布到 npm 了。萬歲!
咱們總結一下:用 Lerna 建立一個新的 monorepo。
爲咱們的 monorepo 添加了三個新的定域包。
更新了全部包的版本並使用一條命令提交給了 git。
有關 Lerna 的更多信息,包括解決重複問題的方案,建議查閱他們提供優秀的文檔: https://github.com/lerna/lerna
將來計劃咱們也很高興地宣佈,咱們計劃爲 npm@7 帶來一流的 monorepo 支持。若是你在搭配 monorepo 使用 npm,咱們須要你的反饋!請告訴咱們你對目前的 monorepo 解決方案的見解。
編程愉快!
英文原文: https://blog.npmjs.org/post/186494959890/monorepos-and-npm
活動推薦月活 4 億,開發者人數 10W+:爆款微信小遊戲背後的技術本質是什麼?8 月 17 日下午,廣州南國酒店,邀請到了來自微信團隊與騰訊雲·雲開發團隊的資深工程師們,爲你們全面講解實時數據庫及小遊戲聯機對戰引擎等實戰內容,並經過現場 Workshop 手把手實操,幫助你們快速開發出一款屬於本身的微信小遊戲。現場還會有小霸王遊戲機、華爲無線充電器超值禮品贈送,坑位有限,掃描如下二維碼或者點擊閱讀原文報名~