npm官宣:將來將支持monorepo特性,帶來源碼管理新姿式!

npm官宣:將來將支持monorepo特性,帶來源碼管理新姿式!


image.png

源自 | The npm Blog譯者 | 王強編輯 | Yonienpm 存在的問題從架構的角度來看,將大型單體代碼庫拆分爲較小的、獨立封裝的一系列模塊一般是個好方法。從微服務到可複用組件庫,不少技術都很適合模塊化。但從版本發佈和源代碼管理的角度來看,它也多是一場噩夢。git

  • 當項目有數十乃至數百個代碼存儲庫時,發現工做也變得越發困難。每當建立一個新的存儲庫,全部人必須將其添加到本身的代碼模塊中
  • 訪問控制成了單調乏味的工做,且容易出錯,尤爲是得在「須要瞭解」的基礎上一次一個地授予存儲庫訪問權限,實在使人頭疼。新員工常常要經歷無止境的依賴項地獄。每一個訪問請求都會引出它們須要訪問的另外兩個存儲庫來。
  • 高度模塊化的架構也使版本控制變複雜了。咱們可讓一系列相關模塊的版本同步更新,給它們作「快照」(例如 Babel 和 React 就是這麼作的)。但要讓人們爲那麼多的包作這種工做(還包括和他們沒什麼關係的包)就是在自找麻煩。
  • 包之間的依賴項重複會大大增長安裝依賴項所需的時間。一些生態系統(特別是 npm)是高度模塊化的。模塊化會鼓勵複用,但也意味着某些包可能在你開發的每一個包裏都複製了一份。github

Monorepo 是解決方案

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 了。萬歲!

咱們總結一下:
  1. 用 Lerna 建立一個新的 monorepo。

  2. 爲咱們的 monorepo 添加了三個新的定域包。

  3. 更新了全部包的版本並使用一條命令提交給了 git。

  4. 使用一條命令將全部包發佈到了 npm 存儲庫。

有關 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 手把手實操,幫助你們快速開發出一款屬於本身的微信小遊戲。現場還會有小霸王遊戲機、華爲無線充電器超值禮品贈送,坑位有限,掃描如下二維碼或者點擊閱讀原文報名~

相關文章
相關標籤/搜索