国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

現(xiàn)代 Monorepo 工程技術(shù)選型,聊聊我的思考

開發(fā) 新聞
看了本文我想大家應(yīng)該理解了 PNPM + Turborepo + Changesets 這個(gè)技術(shù)選型的原因以及要怎么做。

前言

相信很多關(guān)注 Monorepo 生態(tài)的同學(xué),應(yīng)該大都看過這篇文章 monorepo.tools [1] ,其中列舉了現(xiàn)存的幾個(gè)主流的 Monorepo 相關(guān)的工具:

  • Bazel (by Google) [2]
  • Lage (by Microsoft) [3]
  • Lerna [4]
  • Nx (by Nrwl) [5]
  • Rush (by Microsoft) [6]
  • Turborepo (by Vercel) [7]

相應(yīng)地,在這篇文章中也對(duì)各類工具進(jìn)行了一一介紹。并且,我相信每個(gè)看過這篇文章的同學(xué),都會(huì)留下這么個(gè)疑問: 這么多 Monorepo Tool,我要如何進(jìn)行選型?

這里,我給出的答案是 PNPM + Turborepo + Changesets。那么,又為什么是這 3 者呢?下面,我將會(huì)分別圍繞這 3 個(gè)技術(shù)展開,來一一解答這個(gè)選型的原因以及怎么做。

PNPM

PNPM 的動(dòng)機(jī)( Motivation [8] ),如它在官方文檔介紹的所說: “Saving disk space and boosting installation speed”,節(jié)省磁盤空間和提高安裝速度 。除開這個(gè)動(dòng)機(jī)描述的顯著優(yōu)點(diǎn)外, PNPM 內(nèi)置了對(duì) Monorepo 的支持 [9] ,并解決了很多令人詬病的問題。

其中,比較經(jīng)典的就是 Phantom dependencies(幻影依賴)。由于,默認(rèn)情況下 yarn 、 npm 安裝的依賴都是會(huì)被提升。所以,有時(shí)候你可能會(huì)遇到 Monorepo 項(xiàng)目中的某個(gè)包中的 package.json 沒有安裝這個(gè)依賴,結(jié)果實(shí)際代碼中卻使用了這個(gè)依賴...

雖說,PNPM 可以解決這個(gè)問題,但是, 默認(rèn)情況 下 PNPM 安裝的依賴也是會(huì)被提升的。如果,需要 PNPM 禁止依賴提升,我們可以通過在 Monorepo 項(xiàng)目工作區(qū)下的 .npmrc 文件中 配置 [10] ,例如只提升 lodash :

hoist-pattern[]=*lodash*

當(dāng)然,還有一些其他的問題,有興趣的同學(xué)可以看 ELab 團(tuán)隊(duì)寫的這篇文章 《Monorepo 的這些坑,我們幫你踩過了!》 [11] 。

那么,在簡(jiǎn)單解答了為什么用 PNPM 后,下面我們來看一下要怎么用?

Workspace 配置

要使用 PNPM 的 Monorepo 很簡(jiǎn)單,只需要在 Monorepo 項(xiàng)目的工作區(qū)下新建 pnpm-workspace.yaml 文件并配置:

packages:
- 'packages/**'

接下來,則是記憶常用依賴和多包任務(wù)執(zhí)行相關(guān)的命令。由于,我們的技術(shù)選型中有 Turborepo,它會(huì)負(fù)責(zé)多包任務(wù)的執(zhí)行。所以,這里只需要記憶 常用依賴相關(guān)的命令 。

常用依賴相關(guān)命令

pnpm i

在 PNPM 中,安裝依賴可以用 pnpm i 來完成。在 Monorepo 的場(chǎng)景下,默認(rèn)情況下 pnpm i 會(huì)安裝所有的依賴(包括 packages/* )。此外, pnpm i 還需要用到 3 個(gè)選項(xiàng)(Option):

  • --filter <package>,安裝依賴到指定的 package,不聲明要安裝的依賴包則默認(rèn)安裝 package.json 中的所有依賴
  • --prod, P,安裝依賴到 dependencies
  • --dev, D,安裝依賴到 devDependencies

pnpm remove

在 PNPM 中,刪除在 package.json 中的某個(gè)依賴,可以用 pnpm remove 完成。它的選項(xiàng)(Option)使用和 pnpm i 大同小異。其中,不同地是當(dāng)我們?cè)诠ぷ鲄^(qū)想要?jiǎng)h除 packages 中所有包的 package.json 中的某個(gè)依賴的時(shí)候,需要使用 -r ,例如移除所有包中的 lodash :

pnpm remove lodash -r

當(dāng)然,可能還有同學(xué)有一些其他的訴求,有興趣的同學(xué)可以移步文檔了解,這里不做展開。

Changesets

經(jīng)常維護(hù)開源項(xiàng)目的同學(xué)都知道的一點(diǎn),每次包(Package)的發(fā)布,需要修改 package.json 的 version 字段,以及同步更新一下本次發(fā)布修改的 CHANGELOG.md。

這么一來,就會(huì)凸顯一個(gè)問題,每次發(fā)布都需要手動(dòng)地去更新 version 、更新 CHANGELOG.md,未免 有點(diǎn)繁瑣 。并且,用過 Lerna 的同學(xué),應(yīng)該都知道 Lerna 內(nèi)置了對(duì)這塊的支持。

但是,無論是 PNPM 又或者是下面要說的 Turborepo 都不支持這塊,所以 2 者的官方文檔都給大家推薦了用于支持這塊能力的工具,例如 Changesets [12] 、 Beachball [13] 、 Auto [14] 等。

那么,這里我們要介紹的就是 Changesets。下面,我們來看一下在前面建好的 PNPM 的 Monorepo 項(xiàng)目中如何使用 Changesets。首先,需要執(zhí)行在 Monorepo 項(xiàng)目的工作區(qū)下,執(zhí)行如下 2 個(gè)命令:

pnpm i -DW @changesets/cli
pnpm changeset init

前者是安裝 Changesets 的 CLI,后者是初始化 .changeset 文件夾以及對(duì)應(yīng)的文件:

.changeset
-- config.json
|__ README.md

這里,我們來看一下 config.json [15] 文件:

{
"$schema": "https://unpkg.com/@changesets/config@1.6.4/schema.json",
"changelog": "@changesets/cli/changelog",
"commit": false,
"linked": [],
"access": "restricted",
"baseBranch": "master",
"updateInternalDependencies": "patch",
"ignore": []
}

除開 $schema 這個(gè)不需要修改的字段, config.json 文件中列了 7 個(gè)字段,各個(gè)字段分別代表的作用為:

  • changelog 設(shè)置 CHANGELOG.md 生成方式,可以設(shè)置 false 不生成,也可以設(shè)置為定義生成行為的文件地址或依賴名稱,例如 Changsets 提供的 `changelog-git` [16] 。其中,定義生成行為的文件固定代碼模版為:
async function getReleaseLine() {}
async function getDependencyReleaseLine() {}
export default {
getReleaseLine,
getDependencyReleaseLine
}
  • commit 設(shè)置是否把執(zhí)行 changeset add 或 changeset publish 操作時(shí)對(duì)修改用 Git 提交
  • linked 設(shè)置共享版本的包,而不是獨(dú)立版本的包,例如一個(gè)組件庫(kù)中主題和單獨(dú)的組件的關(guān)系,也就是修改 Version 的時(shí)候,共享的包需要同步一起更新版本
  • access 設(shè)置執(zhí)行 npm publish 的 --access 選項(xiàng),通常情況下我們是公共的包,所以設(shè)置 public 即可(注意,它會(huì)被 package.json 中的 access 字段重寫)
  • baseBranch 設(shè)置默認(rèn)的 Git 分支,例如現(xiàn)在 GitHub 的默認(rèn)分支應(yīng)該是 main
  • updateInternalDependencies 設(shè)置互相依賴的包版本更新機(jī)制,它是一個(gè)枚舉( major|minor|patch ),例如設(shè)置為 minor 時(shí),只有當(dāng)依賴的包新了 minor 版本或者才會(huì)對(duì)應(yīng)地更新 package.json 的 dependencies 或 devDependencies 中對(duì)應(yīng)依賴的版本
  • ignore 設(shè)置不需要發(fā)布的包,這些會(huì)被 Changesets 忽略

在初始化 .changeset 文件夾后,就可以正常使用 changeset 相關(guān)的命令,主要是這 3 個(gè)命令:

  • pnpm chageset 用于生成本次修改的要添加到 CHANGELOG.md 中的描述
  • pnpm changeset version 用于生成本次修改后的包的版本
  • pnpm changeset publish 用于發(fā)布包

此外,如果是在業(yè)務(wù)場(chǎng)景下,我們通常需要把包發(fā)到公司 私有的 NPM Registry ,而這有很多種配置方式。但是, 需要注意 的是 Changesets 只支持在每個(gè)包中聲明 publicConfig.registry 或者配置 process.env.npm_config_registry ,對(duì)應(yīng)的代碼會(huì)是這樣:

// https://github.com/changesets/changesets/blob/main/packages/cli/src/commands/publish/npm-utils.ts
function getCorrectRegistry(packageJson?: PackageJSON): string {
const registry =
packageJson?.publishConfig?.registry ?? process.env.npm_config_registry;
return !registry || registry === "https://registry.yarnpkg.com"
? "https://registry.npmjs.org"
: registry;
}

可以看到,如果在前面說的這 2 種情況下獲取不到 registry 的話,Changesets 都是按公共的 Registry 去查找或者發(fā)布包的。

Turborepo

說起 Turborepo,可能大家會(huì)有點(diǎn)陌生。但是,對(duì)于 Vercel [17] 我想大家都知道(畢竟 Rich Harris [18] 、Sebastian Markb?ge 等都加入了),Turbrepo 則是 Vercel 旗下的一個(gè)開源項(xiàng)目。Turborepo 是用于為 JavaScript/TypeScript 的 Monorepo 提供一個(gè)極快的構(gòu)建系統(tǒng),簡(jiǎn)單地理解就是用 Turborepo 來執(zhí)行 Monorepo 項(xiàng)目的中構(gòu)建(或者其他)任務(wù)會(huì) 非常快 !

關(guān)于 Turborepo 其他優(yōu)勢(shì),其 官方文檔 [19] 寫的很詳盡,有興趣的同學(xué)可以自行了解~

所以,你可以理解成 快 是選擇 Turborepo 負(fù)責(zé) Monorepo 項(xiàng)目多包任務(wù)執(zhí)行的原因。而在 Turborepo 中執(zhí)行多包任務(wù)是通過 turbo run <script> 。不過, turbo run 和 lerna run 直接使用有所不同,它需要配置 turbo.json 文件,注冊(cè)每個(gè)需要執(zhí)行的 script 命令。

在 Turborepo 中有個(gè) Pipelines [20] 的概念,它是由 turbo.json 文件中的 pipline 字段的配置描述,它會(huì)在執(zhí)行 turbo run 命令的時(shí)候,根據(jù)對(duì)應(yīng)的配置進(jìn)行 有序的執(zhí)行 和 緩存輸出的文件 。

舉個(gè)例子,通常情況下我們一個(gè) Monorepo 項(xiàng)目中的每個(gè)包可能會(huì)有 dev 、 build 、 test 、 clean 等 4 個(gè)命令,那么對(duì)應(yīng)的 turbo.json 的配置會(huì)是這樣:

{
"pipeline": {
"build": {
"dependsOn": ["^build"],
"outputs": ["dist/**"]
},
"clean": {
"dependsOn": ["^clean"]
},
"test": {
"dependsOn": ["build" "lint"]
},
"dev": {
"cache": false
}
}
}

可以看到, pipeline 中的每個(gè) key 則對(duì)應(yīng)著每個(gè)需要執(zhí)行的 turbo run 命令的名稱,其中 dependsOn 、 outputs 、 cache 等 3 個(gè)字段分別作用為:

  • dependsOn 表示當(dāng)前命令所依賴的命令,^ 表示 dependencies 和 devDependencies 的所有依賴都執(zhí)行完 build,才執(zhí)行 build
  • outputs 表示命令執(zhí)行輸出的文件緩存目錄,例如我們常見的 dist、coverage 等
  • cache 表示是否緩存,通常我們執(zhí)行 dev 命令的時(shí)候會(huì)結(jié)合 watch 模式,所以這種情況下關(guān)閉掉緩存比較切合實(shí)際需求

這樣一來,我們就可以使用諸如 turbo run build test 的命令,它則會(huì)按 pipeline 的配置依次執(zhí)行對(duì)應(yīng)的命令。

當(dāng)然,如果你想每個(gè)命令都支持單獨(dú)執(zhí)行,可以直接配置為 {} 即可。此外,如果要使用 turbo run 命令,還需要在 package.json 中聲明 packageManage 字段為指定的包管理工具及版本,例如 "packageManager": "pnpm@6.30.0" 。

結(jié)語(yǔ)

閱讀到此處,我想大家應(yīng)該理解了 PNPM + Turborepo + Changesets 這個(gè)技術(shù)選型的原因以及要怎么做。當(dāng)然,這個(gè)選型只是我個(gè)人的思考所得出的答案,相信也有同學(xué)仍然鐘情于 Lerna,又或者喜歡 Rush 一把梭,這些觀點(diǎn)并無對(duì)錯(cuò),本質(zhì)上這也是編程的魅力所在, 各個(gè)輪子都有其存在的價(jià)值 。

責(zé)任編輯:張燕妮 來源: Code center
相關(guān)推薦

2023-04-11 08:02:26

單測(cè)技術(shù)JUnit框架

2023-08-23 18:56:46

2021-03-25 09:41:43

前端Monorepo技術(shù)熱點(diǎn)

2016-10-21 15:58:51

容器容器技術(shù)Docker

2022-06-08 13:25:51

數(shù)據(jù)

2024-01-22 10:18:32

平臺(tái)工程開發(fā)人員技術(shù)

2012-07-12 09:37:23

Instagram工程技術(shù)

2023-12-07 07:02:00

大倉(cāng)權(quán)限設(shè)計(jì)

2018-07-23 15:35:17

機(jī)器學(xué)習(xí)特征工程技能數(shù)據(jù)科學(xué)

2020-09-25 07:40:39

技術(shù)開發(fā)選型

2021-03-10 09:33:51

技術(shù)研發(fā)管理

2023-03-31 13:53:00

低代碼平臺(tái)選型

2022-03-18 08:57:17

前端數(shù)據(jù)流選型

2018-02-27 15:10:38

區(qū)塊鏈分布式系統(tǒng)工程技術(shù)

2024-09-03 11:37:48

2021-02-22 09:30:09

go開發(fā)環(huán)境桌面系統(tǒng)

2017-05-05 10:55:31

Web應(yīng)用登錄工程身份驗(yàn)證

2019-11-30 09:41:56

戴爾
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

亚洲一区色图| 最近2019年好看中文字幕视频 | 99re视频精品| 伊人色综合影院| 玖玖精品视频| 久久精品国产综合精品| 羞羞答答成人影院www| 国产91亚洲精品| 激情视频极品美女日韩| 日韩在线观看免费高清完整版| 国产精品vvv| 欧美videofree性高清杂交| 3d成人动漫在线| 欧美日韩成人综合在线一区二区| 男人久久精品| 欧美中文字幕久久| 波多野结衣在线影院| 在线看国产日韩| 美女免费久久| 日韩久久免费av| 麻豆免费在线| 一本色道久久综合狠狠躁篇怎么玩| 99久久精品情趣| 精品深夜福利视频| 日本午夜精品久久久久| 欧美日韩一区二区三区不卡| 在线视频您懂的| 亚洲一区二区四区蜜桃| av在线dvd| 亚洲永久精品大片| 成年人福利视频| 亚洲日本在线天堂| 成人网18免费看| 亚洲欧洲www| 成人伦理视频网站| 亚洲一级二级三级在线免费观看| 大地资源高清播放在线观看| 一区二区三区四区在线免费观看| 日韩男人天堂| 欧美中文字幕一区二区三区| 午夜激情视频在线观看| 日韩亚洲欧美在线| 日韩理论视频| 美女视频久久黄| 国产精品极品国产中出| 国产精品白丝jk喷水视频一区| 久久亚洲影视| 久久大片网站| 国产精品亚洲一区二区三区妖精| 国产视频九色蝌蚪| 亚洲欧洲中文日韩久久av乱码| 污视频在线看操| 日韩一级欧美一级| 性感美女一区二区在线观看| 欧美成人激情图片网| 亚洲理论电影片| 亚洲精品日产aⅴ| 日韩中文字幕91| 欧美二区在线视频| 亚洲激情中文1区| 日韩大片在线永久免费观看网站| 亚洲精品美女网站| 国产精品久久久久av蜜臀| 成人黄色免费片| 久久99热99| 五月婷婷六月丁香激情| 狠狠躁夜夜躁人人爽超碰91| 色屁屁www国产馆在线观看| 俺去啦;欧美日韩| 97精品视频| 精品少妇人妻av一区二区| 中文字幕精品一区二区三区精品| 国产在线黄色| 精品久久国产精品| 欧美91视频| 黄色影院一级片| 欧美亚洲国产一区二区三区| 日本少妇一区| 亚洲japanese制服美女| 国产suv一区二区三区88区| 三上悠亚在线观看二区| 日韩女优视频免费观看| 国产精品qvod| 狠狠色狠狠色综合人人| www国产成人| 欧美老女人性开放| 欧美xxxx18性欧美| 亚洲美女91| 久久国产精品国产精品| 日韩视频123| 一区二区三区日本久久久| 亚洲欧美日韩另类精品一区二区三区 | 久久成人羞羞网站| 在线观看免费观看在线91| 亚洲人成伊人成综合网久久久 | 你懂的在线看| 欧美国产高跟鞋裸体秀xxxhd| 老司机亚洲精品| 一不卡在线视频| 高清欧美性猛交xxxx黑人猛交| 国内成人自拍视频| 日本电影全部在线观看网站视频| 清纯唯美日韩制服另类| 粉嫩高潮美女一区二区三区| 久久国产精品一区| 91精品国产综合久久香蕉922| 国产人成一区二区三区影院| 亚洲天堂手机| 欧美高清性xxxxhdvideosex| 动漫精品一区二区| 精品视频97| 亚洲天堂网一区| 中文字幕日韩欧美在线| 蜜桃视频在线观看一区二区| 免费黄色片在线观看| 国产精品久久久久久久久久新婚 | 亚洲美女少妇撒尿| 国产精品一区二区精品| 亚洲毛片aa| 91精品欧美福利在线观看| 影音先锋日韩精品| 成人在线小说| 国产精品99久久久久久久久| 国产精品女主播在线观看| 久久福利在线| 免费观看国产精品视频| 亚洲色在线视频| 国产91综合网| 国产亚洲一区二区手机在线观看 | 国产精品久久久久久久久久妞妞| 天堂影院在线| 成人午夜在线观看| 午夜视频一区二区| 日韩成人av在线资源| 日本成人黄色网址| 日本亚洲欧洲色| 亚洲成人精品一区二区| 一区二区三区日本久久久 | 久久不射电影网| gogo大胆日本视频一区| 久久91超碰青草在哪里看| 久久久久久久午夜| 欧美国产日韩视频| 国产精品色哟哟| 国产欧美久久一区二区三区| 在线黄色国产视频| 精品一区二区三区免费毛片| 欧美成人欧美edvon| 国产一区二区三区在线观看精品| 蜜桃视频在线观看播放| 黄色成人在线免费观看| 综合激情国产一区| 国产精品理论片| 国产大片一区| av在线免费播放| 国产精品无码免费专区午夜| 欧美日韩电影在线观看| 亚洲精品水蜜桃| 欧美日韩蜜桃| www.youjizz.com在线| 男女超爽视频免费播放| 久久久久亚洲精品| 日韩欧美国产中文字幕| 日韩不卡免费视频| 伊人久久影院| 飘雪影视在线观看免费观看 | 国产福利视频在线播放| 欧美最顶级的aⅴ艳星| 欧美日韩综合视频网址| 狂野欧美性猛交xxxx巴西| 欧美黑人疯狂性受xxxxx野外| 亚洲 中文字幕 日韩 无码| 国产精品久久久久久中文字| 日韩视频在线你懂得| 91视频你懂的| 欧美777四色影| 欧美韩国亚洲| 伊人网在线观看| 国产天堂视频在线观看| 国产精品久久久久久久久久免费| 69精品人人人人| 国产亚洲精品中文字幕| 激情综合久久| 久久久久久亚洲精品美女| 免费在线看v| 无码粉嫩虎白一线天在线观看 | 亚洲一区二区在| 91精品国产乱码久久久久久久久 | 黄色日韩在线| 91久久久久久白丝白浆欲热蜜臀| 日本xxxx高清色视频| 色网站在线免费观看| 第九色区av在线| 性欧美freesex顶级少妇| 日韩欧美一区二区三区免费观看| 国产永久av在线| 好吊日视频在线观看| 欧美卡一卡二| 欧美一区自拍| 丝袜美腿亚洲色图|