精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

基于 lerna 實現 Monorepo 項目管理

開發 項目管理
Monorepo 是一種將多個項目代碼存儲在一個倉庫里的軟件開發策略。根據筆者經驗,Monorepo 將顯著提升開發人員的愉悅度,所以趕緊搞起來吧!

[[434845]]

隨著團隊建設以及相關業務的日益增長,越來越多的 NPM 包需要多人協同維護,各個項目之間有關聯,就不得不在多個編輯器之間切換,以及通過 npm link 來調試,開發的效率受到制約,那有沒有一種方式可以解決現在的痛點?答案就是 Monorepo!

在字節跳動內部的百科詞條中對于 Monorepo 的定義如下:

Monorepo 是一種將多個項目代碼存儲在一個倉庫里的軟件開發策略。

目前來講,Lerna 作為 JavaScript項目的多包管理器,已經是比較成熟,并已被現代企業所驗證,因此接下來將逐步搭建一個基于 Lerna[1] 的 Monorepo 管理環境,希望可以幫助大家在各司業務中落地并實現降本提效。

根據筆者經驗,Monorepo 將顯著提升開發人員的愉悅度,所以趕緊搞起來吧!

本文主要內容結構如下,朋友們可按需食用:

一、為什么選擇 Lerna

Monorepo 能被定義為策略,那么一定是一種能夠解決問題的方案,基于 Lerna 實現的 Monorepo 多包管理方式,能解決的問題(優點)如下:

  1. 扁平:同一倉庫(項目)下,統一管理維護多個 package
  2. 集中:在根目錄的 node_modules/ 文件夾下維護所有 package 的三方依賴
  3. 簡化:根據文件變動統一執行命令,按需發包,自動升級版本并回寫倉庫、打 tag
  4. 高效:有互相依賴的項目直接可直接關聯,避免開發人員在多倉庫之間切換

當然,Lerna 經過長時間的使用,一些問題也在生產環境中暴露出來,典型的如:

  1. 無效構建:每次發包前會對所有的 package 進行構建
  2. 無效依賴:每次發包都會安裝所有 package 的依賴項
  3. 幽靈依賴:Phantom dependencies[2] 在依賴提升(hoist)后更加明顯

這里將問題羅列出來,不是說 Lerna 就應該被放棄,而是我們應當清楚技術方案的利與弊,并結合項目的實際情況做一些取舍,上述的缺點只是在構建中不那么優雅,但并不影響 Lerna 作為一種可落地 Monorepo 的方案。

二、初始化一個 Monorepo 形式的項目

我們將從 0 到 1 構建一個純凈的、基于 Lerna 的 Monorepo 項目,并將利于團隊協作規范的 ESlint 校驗,Prettier 自動格式化,以及 git commit message 規范一并完善。

2.1 初始化項目結構

首先就是得全局安裝 Lerna:

  1. yarn global add lerna 
  2. // or 
  3. npm install lerna -g 

然后就是新建項目目錄,并使用 Lerna 初始化一個基本結構

  1. mkdir dyboy-lerna-project 
  2. cd dyboy-lerna-project/ 
  3. lerna init --independent 

如此之后,便得到了如下的一個文件目錄結構:

  1. ├── lerna.json   // lerna 的配置文件 
  2. ├── package.json // 當前項目的描述文件 
  3. └── packages/    // 存放所有包的文件夾 

Lerna 初始化項目的時候,追加了一個 --independent 的參數,其含義是使用獨立模式。

在 Lerna 中,有兩種模式:

  1. 固定模式:所有 package 的版本號保持一致,每次更新發包都是全量的
  2. 獨立模式:每個 package 版本號各自獨立,互不影響,每次更新按需發包

一般我們都會選擇獨立模式,來避免多 package 下頻繁發包的情況出現,尤其是在一些業務變化頻繁的項目下,發包壓力恐怖如斯😱。

2.2 Lerna + Yarn Workspaces

Lerna 默認會使用 NPM 作為包管理器,但使用 yarn 作為 Lerna 的默認包管理器是更推薦的方式。

在 Yarn 1.0 版本,就已經支持了 workspaces 功能,其優勢以及和 Lerna 的關系可以參考當時的這篇文章:《Workspaces[3]》

Yarn Workspaces 相結合,使得 Lerna 方案補齊短板,如虎添翼。

首先是修改 lerna.json 配置,改為如下內容:

  1. {  
  2.   "version""independent"
  3.   "npmClient""yarn"
  4.   "useWorkspaces"true 

然后在 package.json 文件中指明(新增)workspaces(工作空間)字段:

  1. "workspaces": ["packages/*"], 

意思就是認為 packages/ 目錄下的所有項目都歸 Lerna + Yarn 管理,這之后,無論我們在哪個文件夾下執行 yarn 都將分析 packages/ 目錄下所有項目的依賴,并安裝到根目錄的 node_modules/ 中。

2.3 ESlint + Prettier + Commit Rules

針對項目需要配置上述的規則,在任一項目中來說都是比較統一的,因之前文章中詳述過相關配置流程,此處便不再贅述。

相關配置規則的初始化和詳細流程可參考:《手摸手學會搭建一個 TS+Rollup 的初始開發環境》中第 5~7 步驟。

經過上述配置好之后,我們的項目就算是大致初始化完成了!

2.4 NPM 團隊賬號

因為發包需要賬號,Monorepo 同時管理了數個、數十個包,都需要維護發包。

如果使用個人賬號發包到公司內自建的 Registry 上,萬一該同學離職了,該倉庫會變成“幽靈倉庫”。

當然,我們可以找公司內部 Registry 維護者直接更改對應包,但總歸是比較麻煩的一件事。

為此可以給團隊申請一個公共賬號,通過 npm token create 創建一個權限 token,放到項目根目錄下的 .npmrc 文件中。

之后無論是哪個開發者維護,都將默認使用團隊賬號發包更新。

最后初始化的項目文件結構如下:

三、版本發布

之前說到過,Lerna 可以統一管理所有的包,因此我們可直接在根目錄的 package.json 文件中指定快捷指令,實現按需發包的功能

注意: Lerna 發包時,會默認忽略掉在 package.json 中設置了 "private": true 的私有包。

3.1 項目打包編譯

在發新的包版本之前,一般是需要打包編譯好產物,在 Monorepo 下的多個包發布前,肯定也是需要先打包。

(1). Learn Run

借助 Lerna 提供的 run 命令,可以實現在發包前,讓所有在 package.json -> scripts 中定義了指令的項目執行該命令

例如,執行:lerna exec build

則會遍歷每一個 package,尋找其 package.json -> scripts 中是否定義了 build 命令,有則執行,否則跳過(在所有包含 build 命令的包中運行 npm run build)。

這樣的方式會存在一個問題:每次發包前,都會把所有 pckage 都先 build 了一遍,增加了打包發布的時間。

那有沒有更優雅的方式吶?

(2). NPM Scripts 生命周期

在 package.json 文件中自定義的 scripts 字段,含有默認的兩個生命周期 pre 和 post

通過執行 npm run build,則會先自動執行npm run prebuid,然后是 npm run build,再者是執行 npm run postbuild。

除了 package.json -> scripts 中自定義的命令,還有 npm 自帶的一些 scripts,比如 npm publish。

npm publish 命令的生命周期包含:

  1. prepublishOnly
  2. prepare
  3. prepublish
  4. publish
  5. postpublish

prepare 在 npm publish --dry-run 時不會被執行。

注意:npm 6.x 和 7.x 版本的生命周期有不同,上面是 6.x 版本,考慮到 6.x 和 7.x 版本的差異,建議將發包前的動作放到 prepublishOnly 命令中。

更多可以參考:《scripts - NPM 6.x 官方文檔[4]》 & 《scripts - NPM 7.x 官方文檔[5]》

(3). 按需 Build

有了上面對于 NPM Publish 生命周期的基礎,因此我們可以在需要在發包時候構建的項目(packages/目錄下的項目),在其 package.json -> scripts 中定義如下字段:

  1. "scripts": { 
  2.     "build""rollup -c"
  3.     "prepublishOnly""yarn build" 

如此,在執行 npm publish 的時候,會先執行 prepublishOnly 中的 yarn build,項目編譯打包,然后再發包。

如此,按需發包就可以很優雅、流暢地搞定了!

3.2 項目發包

到了發包階段,我們在根目錄的 package.json 文件中添加內容:

  1. "scripts": { 

  2.   "release""lerna publish"
  3.   "release:beta""lerna publish --canary --pre-dist-tag=beta --preid beta --yes" 
  4. }, 

yarn release 用于發布正式版

yarn relase:beta 則是用于發布測試版本,用于給開發聯調時候測試使用

約定大于配置:在根目錄下的 package.json -> name 字段默認為 root,大家可以理解為“工作根目錄”,如果是有作用域的(scope,例如:@dyboy/utils),可以改名為:@dyboy/root,以便于讓其他開發者知道這是一個有作用域的 Monorepo 項目,盡管 name 字段并沒有什么作用。

總結

基于 Lerna 構建的 Monorepo 項目的心智成本不高,但需要我們對于其中的流程、生命周期、NPM Scripts 等知識有一定的認識和把握,需要構建者能在流程、管理中尋找需求共性和約束規范,為團隊的降本提效落地解決方案。

本文從根據搭建流程來簡述 Monorepo 的一種方案,在前端工程化中,構建者還需要思考是否存在優化空間以及斟酌細節?比如,書寫通俗易懂的 README.md 文檔,思考是否能讓新人更容易上手,嘗試解決流程中的問題并積極探索新的 Monorepo 技術解決方案,比如 Rush、PNPM ...

TODO: 能否實現 Monorepo 自動發正式版本的包?感興趣的朋友可以關注后續的分享嗷!

參考資料

[1]Lerna 官方網站: https://lerna.js.org/

[2]Phantom dependencies - 應用級 Monorepo 優化方案: https://github.com/worldzhao/blog/issues/9

[3]Yarn Workspaces: https://classic.yarnpkg.com/lang/en/docs/workspaces/

[4]scripts - NPM 6.x 官方文檔: https://docs.npmjs.com/cli/v6/using-npm/scripts

[5]scripts - NPM 7.x 官方文檔: https://docs.npmjs.com/cli/v7/using-npm/scripts

 

責任編輯:姜華 來源: DYBOY
相關推薦

2024-05-30 09:07:20

2021-10-05 21:56:43

管理Dumi Eslint

2023-08-23 18:56:46

2023-12-07 07:02:00

大倉權限設計

2024-03-21 15:07:22

2023-07-12 20:12:57

前端Monorepo代碼

2020-12-28 05:56:57

Monorepo代碼庫工具

2025-01-13 07:15:00

Monorepo代碼倉庫中項目代碼管理

2022-07-20 10:01:23

MonorepoReact

2010-02-26 15:09:59

Linux NFS

2024-10-06 12:35:50

2019-08-22 09:55:17

RedisAPI數據

2015-03-09 10:33:14

即時通信管道過濾

2022-09-13 15:33:48

KubeEdge邊緣計算容器

2016-09-29 15:44:18

開源上網管理

2010-06-01 09:33:48

SVN創建管理項目

2021-03-25 09:41:43

前端Monorepo技術熱點

2022-09-22 09:54:56

技術選型

2025-10-29 07:38:45

點贊
收藏

51CTO技術棧公眾號

成人激情视频在线| 亚洲欧美日韩一区二区三区在线| 人人妻人人澡人人爽欧美一区 | 日韩在线资源| 国产乱码一区二区三区| 97av在线视频免费播放| 天天躁夜夜躁狠狠是什么心态| 国产一区二区av在线| 午夜不卡在线视频| 中文字幕欧美日韩一区二区三区 | 成人免费视频免费观看| 日本亚洲精品在线观看| 亚洲成人生活片| 国产精品一国产精品| 欧美一级欧美三级在线观看| 无码人妻丰满熟妇区毛片18| 在线免费观看a视频| 久久精品人人做人人综合| 91最新在线免费观看| 亚洲 欧美 日韩 在线| 激情亚洲网站| 久久精品国产久精国产一老狼| 国产精品一级黄片| 高清久久精品| 欧美日韩亚洲综合在线| 国产美女在线一区| 伊人福利在线| √…a在线天堂一区| 欧美日韩在线高清| 丰满人妻熟女aⅴ一区| 国模一区二区三区白浆| 欧美做爰性生交视频| 国产大片中文字幕在线观看| 五月天综合网站| 一区三区二区视频| 免费a在线观看播放| 91精品啪在线观看国产爱臀| 在线观看91精品国产麻豆| 五月天婷婷激情视频| 涩涩av在线| 精品二区三区线观看| 国产高清www| www.综合网.com| 一区二区三区欧美日| 中文字幕第一页亚洲| 在线观看免费版| 国产精品私人影院| 婷婷亚洲婷婷综合色香五月| 精品成人一区二区三区免费视频| 91亚洲国产成人精品一区二区三| 国产视频在线观看一区| 亚洲美女综合网| 福利电影一区二区三区| 国产成人精品日本亚洲11| 国产丝袜在线视频| 国产精品一区二区久久不卡| 亚洲一区国产精品| www.国产三级| 成人久久18免费网站麻豆| av日韩中文字幕| 免费a视频在线观看| 99久久久精品| 欧美久久久久久久| 国产尤物视频在线| 中文字幕亚洲一区二区av在线| 色综合久久88色综合天天提莫| 97在线观看免费观看高清| 国产精品初高中害羞小美女文| 在线免费观看成人| 自拍亚洲图区| 狠狠干狠狠久久| 日韩精品无码一区二区三区免费| 欧美xxxx做受欧美护士| 欧美日韩高清在线播放| 中文字幕第六页| 乱亲女h秽乱长久久久| 亚洲人成电影网| 毛片久久久久久| 国内激情久久| 欧美在线观看网址综合| 成年人晚上看的视频| 久久99久久久欧美国产| 国产乱码精品一区二区三区不卡| 亚洲 小说区 图片区 都市| 国产午夜亚洲精品午夜鲁丝片| 亚洲午夜精品久久久中文影院av | 亚洲精品菠萝久久久久久久| 色欲色香天天天综合网www| 国产高清不卡| 91精品国产麻豆国产自产在线| 国产a级片视频| 奇米狠狠一区二区三区| 久色乳综合思思在线视频| 国产精品变态另类虐交| 视频在线观看一区二区三区| 91久久久在线| 三级在线视频| 怡红院av一区二区三区| 男人操女人免费| 久久视频免费| 一区二区三区视频免费在线观看| 国内偷拍精品视频| 秋霞av亚洲一区二区三| 国产精品久久久久久久久久久久午夜片 | 日本一区视频在线播放| 最新国产在线拍揄自揄视频| 日本高清不卡视频| 美女黄色一级视频| 久久精品青草| 国产成人午夜视频网址| www.精品视频| 国产精品久久久久国产精品日日| 一区二区传媒有限公司| 国产美女视频一区二区| 亚洲人高潮女人毛茸茸| 国产精品18p| 国产精品正在播放| 亚洲激情电影在线| 亚洲精品永久免费视频| 精品欧美乱码久久久久久| gv天堂gv无码男同在线观看 | wwwwww.色| 天堂日韩电影| 久久久久久久久久亚洲| 国产乱人乱偷精品视频| 中文字幕av一区二区三区| 免费观看精品视频| 国产无遮挡裸体免费久久| 欧美成年人视频网站欧美| 中文字幕在线观看1| 久久婷婷久久一区二区三区| 久久久久久人妻一区二区三区| 久久99久久久精品欧美| 中文字幕欧美日韩在线| 免费观看日批视频| 久久久亚洲综合| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 嗯用力啊快一点好舒服小柔久久| 免费91在线视频| 国产av精国产传媒| 亚洲伦在线观看| 欧美色图校园春色| 欧美一区二区三区另类| 亚洲资源在线看| 18网站在线观看| 日韩视频免费观看高清在线视频| 久久嫩草捆绑紧缚| 精品一区二区三区在线观看| 夜夜爽99久久国产综合精品女不卡| jizzyou欧美16| 日韩天堂在线视频| 国产精品永久久久久久久久久| 国产精品久久久久影院| 福利片一区二区三区| 四季av一区二区三区免费观看| 国产原创欧美精品| caopo在线| 亚洲成av人片在线观看香蕉| 久久精品女人毛片国产| 99久久精品免费看国产免费软件| 欧美,日韩,国产在线| 亚洲免费成人av在线| 国产成人精彩在线视频九色| 69视频在线| 欧美一区二区免费视频| 国产一级特黄a高潮片| 99久久精品免费看| 日日噜噜噜噜久久久精品毛片| japanese国产精品| 91欧美激情另类亚洲| 亚洲丝袜一区| 精品网站999www| 中文字幕+乱码+中文| 亚洲男人天堂av| 你懂的在线观看网站| 久久午夜电影| 亚洲一区二区在线看| 欧洲大片精品免费永久看nba| 久久久久久久一区二区| 青青青手机在线视频观看| 欧美丝袜丝nylons| 久久机热这里只有精品| 久久嫩草精品久久久久| 天天综合天天添夜夜添狠狠添| 国产精品v日韩精品v欧美精品网站 | 欧美国产视频在线| 国产又粗又猛又爽又黄| 国产麻豆综合| 在线精品日韩| 亚洲另类av| 亚洲xxxx做受欧美| 国产精品av一区二区三区| 久久久精品一区二区三区| 少妇精品高潮欲妇又嫩中文字幕| 欧美三级欧美一级| 五月婷婷激情网| 中文字幕一区二区三区乱码在线| 黄色av网址在线观看| 久久国产免费看| 免费成人午夜视频| 综合色一区二区| 日韩欧美亚洲在线| 99国产精品久久一区二区三区| 日韩av免费看| av在线资源| 超在线视频97| 国产在线视频资源| 亚洲国产小视频| 一级特黄色大片| 色哟哟国产精品免费观看| 人妻久久一区二区| 亚洲国产精品黑人久久久| 欧美肉大捧一进一出免费视频| 精品影院一区二区久久久| 美女福利视频在线| 亚洲精品欧洲| 91视频成人免费| 欧美激情理论| 色播亚洲视频在线观看| 欧美三级午夜理伦三级小说| 18成人在线| 亚洲久草在线| 国产精品香蕉在线观看| 国产日韩电影| 2019精品视频| h片在线观看视频免费| 欧美精品日韩www.p站| 调教视频免费在线观看| 国产香蕉97碰碰久久人人| 熟妇人妻一区二区三区四区| 日韩三级视频中文字幕| 国产精品亚洲欧美在线播放| 欧美日本一道本| 中文字幕福利视频| 欧美性色欧美a在线播放| 日本中文字幕第一页| 日韩欧美精品在线观看| 一级片中文字幕| 无吗不卡中文字幕| 日韩av片在线播放| 午夜精彩视频在线观看不卡| 久久综合加勒比| 亚洲国产精品一区二区尤物区| 欧美另类视频在线观看| 一区二区日韩av| 麻豆视频在线观看| 亚洲va欧美va人人爽午夜| 久草中文在线视频| 亚洲高清免费在线| 日韩乱码人妻无码中文字幕| 天天综合网 天天综合色| 97超碰人人干| 欧美日韩一区二区在线| 亚洲图片在线视频| 色域天天综合网| 姑娘第5集在线观看免费好剧| 在线精品观看国产| 夜夜嗨aⅴ一区二区三区| 欧美猛男男办公室激情| 国产三级自拍视频| 91精选在线观看| 成人1区2区3区| 日韩精品在线私人| 国产经典自拍视频在线观看| xvideos成人免费中文版| а√天堂资源地址在线下载| 欧美激情xxxxx| 是的av在线| 国产日韩欧美在线看| 麻豆国产精品| 精品网站在线看| 日韩国产在线| 国产一区二区四区| 美女国产精品| 亚洲一区二区偷拍| 不卡一卡二卡三乱码免费网站| 久久精品无码一区| 亚洲欧美日韩在线不卡| 日韩精品在线不卡| 欧美午夜精品理论片a级按摩| 国产视频在线观看免费| 亚洲精品aⅴ中文字幕乱码| 国产对白叫床清晰在线播放| 按摩亚洲人久久| 第一福利在线视频| 国产精品视频网址| 国产主播性色av福利精品一区| 日本不卡一区二区三区视频| 亚洲精品国产首次亮相| 美女日批免费视频| 九九国产精品视频| www.免费av| 一区二区在线观看视频| 成人免费毛片视频| 精品国产伦理网| 思思99re6国产在线播放| 性欧美暴力猛交69hd| 欧美男女视频| 久久久久久亚洲精品不卡4k岛国| 外国成人激情视频| 成人在线免费播放视频| 国产 日韩 欧美大片| 欧美一区二区三区粗大| 亚洲.国产.中文慕字在线| 97人妻精品一区二区三区动漫| 亚洲国产另类 国产精品国产免费| 亚洲成a人v欧美综合天堂麻豆| 久久久久久美女| 国产精品高清一区二区| 日本免费高清不卡| 国产一区二区三区的电影| 亚洲综合123| 国产精品国产三级国产三级人妇 | 91精品国产美女浴室洗澡无遮挡| 黄色在线小视频| 久久人人爽人人爽人人片av高清| 欧美激情福利| 亚洲精品日韩成人| 久久在线91| 亚洲天堂资源在线| 亚洲线精品一区二区三区| 国产精品久久久久久无人区 | 91精品在线一区二区| 欧美色18zzzzxxxxx| 久久久天堂国产精品女人| 欧美一级片网址| 欧美做受777cos| 韩国女主播成人在线| 国产福利在线导航| 欧美三级中文字| av黄色在线观看| 国产精品久久久久久久7电影| 窝窝社区一区二区| 自拍日韩亚洲一区在线| 丁香婷婷综合网| 免费一级肉体全黄毛片| 日韩欧美国产不卡| 日本一本在线免费福利| 成人动漫在线视频| 狠久久av成人天堂| 一二三区视频在线观看| 亚洲一线二线三线视频| 999久久久久| 欧美剧在线观看| 香蕉免费一区二区三区在线观看| 久久久久久久免费视频| 国产精一品亚洲二区在线视频| av最新在线观看| 日韩一级二级三级| 亚洲电影视频在线| 国产欧美日韩伦理| 宅男噜噜噜66一区二区| 亚洲做受高潮无遮挡| 一本久久综合亚洲鲁鲁五月天| 国产中文字幕在线看| 国产久一一精品| 亚洲综合激情在线| youjizz.com日本| 欧美日韩国产精品一区| 可以直接在线观看的av| 国产第一区电影| 91精品电影| 国产精品熟妇一区二区三区四区| 午夜影视日本亚洲欧洲精品| 青青免费在线视频| 国产精品入口日韩视频大尺度| 国产精品久久天天影视| 无码人妻丰满熟妇区毛片蜜桃精品| 亚洲成人综合网站| 三级视频在线播放| 国产一区二区在线免费视频| 综合久久一区| 中文字幕一区二区三区人妻| 欧美性大战久久久| 91福利国产在线观看菠萝蜜| 国产精品日韩一区二区免费视频| 老鸭窝亚洲一区二区三区| 992在线观看| 亚洲精品在线三区| 日本肉肉一区| 国产 欧美 日韩 一区| 久久色在线视频| 国产乱码精品一区二区| 欧美一级bbbbb性bbbb喷潮片| 青青草成人影院| 免费看91视频| 日本久久一区二区三区| 97超碰资源站在线观看| 欧美精品一区在线| 国产传媒日韩欧美成人| 欧美精品一二三四区| 美女少妇精品视频| 亚洲综合福利| 小日子的在线观看免费第8集| 欧美性xxxx在线播放| 高清免费电影在线观看| 欧美一区国产一区| 大陆成人av片| 中文字幕视频一区二区| 8090成年在线看片午夜|