Heft 架構
先閱讀此處 🎈
以下為 Heft 最重要概念的快速摘要
動作
在 Heft 的術語中,「動作」是一個命令列動詞,由 Rush Stack 的 ts-command-line 系統正規化。使用 heft --help
來查看可用的動作。clean
和 run
動作是由 Heft 本身提供的;其他動作則會由您的 heft.json 組態產生。
範例:殼層指令 heft test --clean
為呼叫 test
動作。
注意:Heft 的早期版本也使用「動作」這個單字作為 heft.json 中的
eventActions
。此術語不再使用。
參數
動作支援各種命令列「參數」以調整行為。有些參數是由 Heft 本身定義的;其他參數則是 Heft 外掛提供的。
範例:殼層指令 heft test --clean
使用 --clean
參數。
任務
Heft「任務」定義在專案的 heft.json 組態檔的 tasksByName
區段中。任務通常會讀取輸入檔和/或產生輸出檔,經常會呼叫常見的工具,例如 TypeScript 或 ESLint。每個任務都會載入 Heft 任務外掛(請見下方)。兩個不同的任務有可能載入相同的外掛。任務可以互相依賴,這會決定排程順序。
範例:@rushstack/heft-web-rig
設定 定義 名為 webpack
的工作。
階段
「階段」是 Heft 工作的排列組合,定義於專案 **heft.json** 設定檔中的 phasesByName
區段。在該檔案中,階段被賦予名稱,例如 build
或 test
。定義階段會建立兩個相對應的命令列動作。例如,test
階段產生 heft test
和 heft test-watch
動作。-watch
變異是針對互動式監控模式,例如 localhost 開發伺服器。
如果工作屬於相同的階段,它們可以共用記憶體物件進行最佳化;否則,它們只能透過將檔案寫入磁碟來進行通訊。此需求支援與 Rush 階段 整合,其可能在不同的時間點或在不同的電腦上執行,透過 Rush 建置快取進行通訊。
範例:@rushstack/heft-web-rig
設定 定義 包含 webpack
工作的 build
階段。
外掛程式
Heft 外掛程式是實作 IHeftPlugin
契約的 TypeScript 類別。有兩種外掛程式
- 工作外掛程式可以由 heft.json 工作加載並提供其實作
- 生命週期外掛程式提供與任何工作無關的一般功能;例如收集計時指標
外掛程式封裝
「外掛程式封裝」是一種提供 Heft 外掛程式的 NPM 封裝。NPM 封裝命名模式為 heft-____-plugin
或 heft-____-plugins
(視外掛程式的數量)。內建外掛程式直接從 @rushstack/heft
封裝載入。
請參閱 外掛程式封裝索引 取得官方外掛程式清單。
範例:@rushstack/heft-jest-plugin
封裝實作 jest-plugin。
外掛程式清單
每個外掛程式封裝都包含一個稱為「外掛程式清單」的檔案 heft-plug.json。它描述可用的外掛程式、其選項和其命令列參數。Heft 是資料驅動的,這表示可以在不執行任何自訂指令碼的情形下找出此類資訊。(儘管指令碼設定非常普遍,但它有許多問題,例如意外的效能成本、不可預測的行為、阻礙快取和錯誤訊息不佳。)
範例:@rushstack/heft-jest-plugin
封裝在 此清單 中宣告 jest-plugin
。
Hook
Heft 外掛程式可以在建置生命週期中為各種事件註冊處理常式。事件「掛勾」的 API 術語來自 Heft 使用與 Webpack 外掛程式類似的 tapable 系統。
範例:在 Heft 原始碼中,IHeftTaskHooks 介面公開了一些掛勾。
Rig 套件
Heft 的主要理念是將建置邏輯移到外掛程式套件中,以便透過組態檔而非程式指令碼來定義你的建置流程。在大型單一儲存庫中,這大大地降低了維護成本,確保會將程式指令碼開發成專業軟體,而不是在 .js
檔中的臨時指令。
Rush Stack Rig 系統 更進一步,可以將組態檔移到稱為「Rig」的集中 NPM 套件中。Rig 為你的專案定義標準化組態。在大型單一儲存庫中,它們會將你的建置團隊同意支援的組態形式化。Heft 也允許從 Rig 套件解決 devDependencies
,並因此減少 package.json 的雜亂程度。
範例: @rushstack/heft-web-rig 是 Rush Stack 用於網路專案的參考 Rig。
Rig 設定檔
單一 Rig 套件可以提供多個針對特定目的量身打造的「設定檔」。Rig 套件內的設定檔共用相同的 Rigged devDependencies
,並也可以透過 "extends"
繼承來共用組態。
範例: @rushstack/heft-web-rig
Rig 套件目前定義了 兩個設定檔,app
和 library
。