摘要:目前最常見的解決方案是和的特性。具體的使用方法移步官網(wǎng)而使用作為包管理器的同學(xué),可以在中以字段聲明,就會(huì)以的方式管理。這樣的話,無(wú)論你的包管理器是還是,都能發(fā)揮的優(yōu)勢(shì)要是包管理是,就會(huì)把依賴安裝交給處理。
最近我接手了一個(gè)項(xiàng)目,代碼量比較大、有點(diǎn)復(fù)雜。倉(cāng)庫(kù) clone 下來(lái)代碼有 50+ MB,npm install 安裝完體積飚到了近 2GB …… 熟悉了一下,這個(gè)項(xiàng)目比較復(fù)雜,采用了 monorepo 的方式進(jìn)行代碼的管理。折騰幾天后,對(duì) monorepo 也有個(gè)大概的了解……
MonorepoMonorepo 是管理項(xiàng)目代碼的一個(gè)方式,指在一個(gè)項(xiàng)目倉(cāng)庫(kù) (repo) 中管理多個(gè)模塊/包 (package),不同于常見的每個(gè)模塊建一個(gè) repo。
目前有不少大型開源項(xiàng)目采用了這種方式,如 Babel:
How is the repo structured?
The Babel repo is managed as a monorepo that is composed of many npm packages.
還有 create-react-app, react-router 等??梢钥吹竭@些項(xiàng)目的第一級(jí)目錄的內(nèi)容以腳手架為主,主要內(nèi)容都在 packages 目錄中、分多個(gè) package 進(jìn)行管理。
├── packages | ├── pkg1 | | ├── package.json | ├── pkg2 | | ├── package.json ├── package.json
monorepo 最主要的好處是統(tǒng)一的工作流和Code Sharing。比如我想看一個(gè) pacakge 的代碼、了解某段邏輯,不需要找它的 repo,直接就在當(dāng)前 repo;當(dāng)某個(gè)需求要修改多個(gè) pacakge 時(shí),不需要分別到各自的 repo 進(jìn)行修改、測(cè)試、發(fā)版或者 npm link,直接在當(dāng)前 repo 修改,統(tǒng)一測(cè)試、統(tǒng)一發(fā)版。只要搭建一套腳手架,就能管理(構(gòu)建、測(cè)試、發(fā)布)多個(gè) package。
不好的方面則主要是 repo 的體積較大。特別是,因?yàn)楦鱾€(gè) package 理論上都是獨(dú)立的,所以每個(gè) package 都維護(hù)著自己的 dependencies,而很大的可能性,package 之間有不少相同的依賴,而這就可能使install時(shí)出現(xiàn)重復(fù)安裝,使本來(lái)就很大的 node_modues 繼續(xù)膨脹(我稱這為「依賴爆炸」...)。
基于對(duì)以上的理解,我認(rèn)為當(dāng)項(xiàng)目到一定的復(fù)雜度,需要且可以劃分模塊、但模塊間聯(lián)系緊密的,比較適合用 monorepo 組織代碼。
目前最常見的 monorepo 解決方案是 Lerna 和 yarn 的 workspaces 特性。其中,lerna 是一個(gè)獨(dú)立的包,其官網(wǎng)的介紹是:
a tool that optimizes the workflow around managing multi-package repositories with git and npm.
上面提到的 Babel, create-react-app 等都是用 lerna 進(jìn)行管理的。在項(xiàng)目 repo 中以lerna.json聲明 packages 后,lerna 為項(xiàng)目提供了統(tǒng)一的 repo 依賴安裝 (lerna bootstrap),統(tǒng)一的執(zhí)行 package scripts (lerna run),統(tǒng)一的 npm 發(fā)版 (lerna publish) 等特性。對(duì)于「依賴爆炸」的問題,lerna 在安裝依賴時(shí)提供了--hoist選項(xiàng),相同的依賴,會(huì)「提升」到 repo 根目錄下安裝,但……太雞肋了,lerna 直接以字符串對(duì)比 dependency 的版本號(hào),完全相同才提升,semver 約定在這并不起作用。
具體的使用方法移步 Lerna 官網(wǎng):https://lerna.js.org
而使用 yarn 作為包管理器的同學(xué),可以在 package.json 中以 workspaces 字段聲明 packages,yarn 就會(huì)以 monorepo 的方式管理 packages。相比 lerna,yarn 突出的是對(duì)依賴的管理,包括 packages 的相互依賴、packages 對(duì)第三方的依賴,yarn 會(huì)以 semver 約定來(lái)分析 dependencies 的版本,安裝依賴時(shí)更快、占用體積更??;但欠缺了「統(tǒng)一工作流」方面的實(shí)現(xiàn)。
yarn 官網(wǎng)對(duì) workspace的詳細(xì)說(shuō)明:Workspaces | Yarn
lerna 和 yarn-workspace 并不是只能選其一,大多 monorepo 即會(huì)使用 lerna 又會(huì)在 package.json 聲明 workspaces。這樣的話,無(wú)論你的包管理器是 npm 還是 yarn,都能發(fā)揮 monorepo 的優(yōu)勢(shì);要是包管理是 yarn ,lerna 就會(huì)把依賴安裝交給 yarn 處理。
再說(shuō)回我那項(xiàng)目呢,安裝依賴后體積實(shí)在是大,折騰了兩天想要優(yōu)化一下,但目前大量腳本嚴(yán)重依賴 npm,我……
還是后面考慮慢慢遷移到 yarn 吧。
Referencebabel/monorepo.md at master · babel/babel
EHOIST_ROOT_VERSION warning hoisting question · Issue #872 · lerna/lerna
Others git-submodule通過(guò) Git 子模塊,可以在當(dāng)前 repo 中包含其它 repos、作為當(dāng)前 repo 的子目錄使用,同時(shí)能夠保持 repos 之間的獨(dú)立。
# 在當(dāng)前 repo 添加一個(gè)子模塊 git submodule add git@github.com:xxx/xxx.git path/to/xxx
可以在 .gitmodule文件中看到當(dāng)前 repo 有哪些 submodule,分別的 name, branch 等。
# clone 含有 submodule 的 repo 后: # 初始化 git submodule 信息 git submodule init # 更新 submodule,相當(dāng)于 git pull 吧 git submodule update
修改子模塊文件后,在當(dāng)前 repo 執(zhí)行 git status 只會(huì)看到有模塊的 changes,而不是具體子模塊文件:
diff --git a/path/to/submodule b/path/to/submodule --- a/path/to/submodule +++ b/path/to/submodule @@ -1 +1 @@ -Subproject commit xxxxxxx +Subproject commit xxxxxxx-dirty
dirty表示子模塊的修改還不是 commit。如果子模塊的修改 commit 后,這個(gè)改動(dòng)就會(huì)是具體的 commit id。
子模塊的其它 commit, pull 等各操作,還是到其目錄下,按普通 repo 操作即可。
Reference
Git - 子模塊:
https://git-scm.com/book/zh/v...
man git-submodule
git submodules - Git diff says subproject is dirty - Stack Overflow
https://stackoverflow.com/que...
git-bisectgit 有一個(gè)以二分法幫助定位問題的命令——bisect。
# 開始二分查找問題 git bisect start # 標(biāo)記當(dāng)前有問題 git bisect bad # 標(biāo)記哪個(gè) commit 或 tag 時(shí)是沒問題的 git bisect good v1.0.0 # 此時(shí) git 會(huì) checkout 兩個(gè)點(diǎn)之間的某個(gè) commit, # 如果此時(shí)還是有問題: git bisect bad # 如果此時(shí)沒有問題: git bisect good # 接著 git 會(huì) checkout 下一個(gè)「有問題」和「沒問題」之間的 commit # 直到定位到問題,git 會(huì)提示:xxxxxxx is first bad commitReference
使用 Git 調(diào)試
https://git-scm.com/book/zh/v...
歡迎關(guān)注我的訂閱號(hào)——「車迷與碼農(nóng)」,不定期分享關(guān)于前端、汽車和有趣的事兒~
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/109885.html
摘要:引言本周精讀的文章是。精讀總的來(lái)說(shuō),雖然拆分子倉(cāng)庫(kù)拆分子包是進(jìn)行項(xiàng)目隔離的天然方案,但當(dāng)倉(cāng)庫(kù)內(nèi)容出現(xiàn)關(guān)聯(lián)時(shí),沒有任何一種調(diào)試方式比源碼放在一起更高效。前端精讀幫你篩選靠譜的內(nèi)容。 1. 引言 本周精讀的文章是 The many Benefits of Using a Monorepo。 現(xiàn)在介紹 Monorepo 的文章很多,可以分為如下幾類:直接介紹 Lerna API 的;介紹如何...
摘要:最近發(fā)現(xiàn)公司一個(gè)項(xiàng)目的目錄組織挺奇怪的,所有的子項(xiàng)目都放在了目錄里,還有這種騷操作特意查了下資料,發(fā)現(xiàn)是一種比較流行的項(xiàng)目管理模式。 最近發(fā)現(xiàn)公司一個(gè)項(xiàng)目的目錄組織挺奇怪的,所有的子項(xiàng)目都放在了packages目錄里,還有這種騷操作?特意查了下資料,發(fā)現(xiàn)是一種比較流行的monorepo項(xiàng)目管理模式。近幾年比較火的React,Vue,Babel都是用的這種模式: showImg(http...
我們先說(shuō)下 Yarn workspace 首先Yarn workspace 是 Yarn 提供的 monorepo 下,管理依賴的機(jī)制。這就說(shuō)主要對(duì)代碼倉(cāng)庫(kù)下,多個(gè) package 的依賴,進(jìn)行管理:將共同的依賴,做 hosting(提升)。前述這樣就可以有效的防止 package 中的包重復(fù)安裝。 workspace 機(jī)制,會(huì)在根目錄下,統(tǒng)一安裝依賴到 node_module,并生成...
摘要:一個(gè)復(fù)雜的應(yīng)用都是由簡(jiǎn)單的應(yīng)用發(fā)展而來(lái)的隨著越來(lái)越多的功能加入項(xiàng)目代碼就會(huì)變得越來(lái)越難以控制本文章主要探討在大型項(xiàng)目中如何對(duì)組件進(jìn)行組織讓項(xiàng)目具備可維護(hù)性系列目錄類型檢查組件的組織樣式的管理組件的思維狀態(tài)管理目錄組件設(shè)計(jì)的基本原則基本原則高 一個(gè)復(fù)雜的應(yīng)用都是由簡(jiǎn)單的應(yīng)用發(fā)展而來(lái)的, 隨著越來(lái)越多的功能加入項(xiàng)目, 代碼就會(huì)變得越來(lái)越難以控制. 本文章主要探討在大型項(xiàng)目中如何對(duì)組件進(jìn)行組...
摘要:指向一個(gè)文件,這個(gè)文件描述了所有的字段以及約束。其中一個(gè)項(xiàng)目為一個(gè)子項(xiàng),如為一個(gè)項(xiàng)目,在創(chuàng)建時(shí)自動(dòng)生成。整個(gè)也有此字段,默認(rèn)生效于所有。默認(rèn)項(xiàng)目,當(dāng)使用一些命令沒有指定項(xiàng)目名稱時(shí),默認(rèn)指向的項(xiàng)目。 ... 在Angular CLI 6+的版本后,原先的angular-cli.json就被換成了angular.json,而其中里面的字段變化挺大了,如果不了解基本的組成,或者直接把老版本的...
閱讀 863·2021-10-09 09:44
閱讀 751·2019-08-30 13:55
閱讀 3215·2019-08-29 15:07
閱讀 3275·2019-08-29 13:09
閱讀 2465·2019-08-29 11:10
閱讀 1354·2019-08-26 14:05
閱讀 3680·2019-08-26 13:57
閱讀 2254·2019-08-23 16:42