1. 簡述
當一個項目中子工程較多時,就會面臨「單倉庫(Monorepo)」還是「多倉庫(Multirepo)」管理的問題。當然兩個方式各有優缺點,而我們選擇多工程單 Repo 時,能夠帶來一些管理上的簡便,比如「Issues 和 PR 的集中管理、整體一緻的 Changelog 等」。而進一步「子產品間的依賴管理、版本管理、釋出管理」等問題,如果能有在工具層的支援,那「 多工程單 Repo 」将進一步友善開發者。
一些項目或會借助額外的工具比如 Lerna,而基于 Dawn 的工程再引入 Lerna 又顯得麻煩,且 Lerna 在使用 tnpm 時會有一些不便之處。
而 Solution 中間件是針對 Dawn 的單 Repo 多 Package 解決方案,通過 Solution 中間件可基于 Dawn 的基本指令在一個 Reop 中輕易管理多個 Packages,在此介紹一下 Solution 中間件的使用方法。
2. 使用
2.1. 啟用 Solution 中間件
一個基于 Dawn 的工程都會有一個 pipe.yml,聲明了工作流中各階段需要做的事情,每件事情能常是由某個中間件提供能力,Solution 也是作為一個中間件存在,為 Dawn 帶來多 Packages 的管理能力。
dev:
- name: solution
build:
- name: solution
test:
- name: solution
add:
- name: solution
link:
- name: solution
publish:
- name: solution
通過如上的配置,将 Solution 工程也就是頂層 Package 的所有 Pipeline 都交由 Solution 中間件負責。
2.2. 在 Solution 中添加 Package
在 Solution 工程的根目錄建立一個名稱
packages
的目錄(預設為 packages 但可指定為其他目錄),然後,執行如下指令
dn add
根據提示選擇 'Create a new package',可快速在 Solution 中建立一個 Package。當然也可手動在 packages 目錄中建立新的 Package
2.3. 配置 packages
在 .dawn 目錄中建立一個 solution.yml 配置檔案,在檔案中添加如下配置
# 是否為統一模式(可省略,預設為 true)
unified: true
# packages 的根目錄 (可省略,預設為 ./packages)
root: ./packages
# 聲明所有 packages
packages:
- name: your_package1
- name: your_package2
- name: your_package3
deps:
- your_package1
- your_package2
如上示例,通過 packages 可聲明 Solution 中有哪些 package,聲明的順序即「測試、建構、釋出」等的順序。
在聲明完成後,執行如下指令即可自動完成所有 Packages 間的依賴配置
dn run link
2.4. 安裝外部依賴
為所有或指定的 Pakcages 安裝依賴時,也是使用
dn add
指令,如下
dn add
根據提示選擇
Install a remote package
即可為全部或指定的 Packages 安裝依賴的遠端 npm package。
2.5. 釋出 Packages
如需釋出能力,那麼 solution 中的每個 package 都應該在 pipe 中配置 publish,當 unified 為 true 時,在執行 dn publish 時,會為每個 package 生成統一的版本,并全部釋出。而當 unified 為 false 時,将僅依次執行每個 package 自已的 publish pipeline。
通常 Package 的 publish 配置如下:
publish:
- name: call
pipe:
- test
- build
- name: publish
然後,在 Solution 根目錄,即可通過如下指令完成釋出
dn publish
2.6. 其他正常操作
通常情況下,在 Solution 中和單工程的 Dawn 指令是一樣,參考如下這些示例指令
# 執行測試
dn test
# 執行建構
dn build
# 啟動本地開發
dn test
2.7 執行任意指令
有時我們想在所有或指定的幾個 Packages 中執行一些指令,和單工程中執行自定義 pipe 類似,指令如下:
dn run
執行如上命僅,将會讓開發人員選擇目示 Pakcages,并提示輸入指令(任意的 shell 指令),輸入後回車卻可在指定的 Pakcage 中執行相關指令。
3. 相關連結
- Dawn 項目位址: https://github.com/alibaba/dawn
- Dawn 首頁: https://alibaba.github.io/dawn