Rush Stack商店部落格活動
跳至主要內容

Heft 架構

先閱讀此處 🎈

以下為 Heft 最重要概念的快速摘要

動作

在 Heft 的術語中,「動作」是一個命令列動詞,由 Rush Stack 的 ts-command-line 系統正規化。使用 heft --help 來查看可用的動作。cleanrun 動作是由 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 區段。在該檔案中,階段被賦予名稱,例如 buildtest。定義階段會建立兩個相對應的命令列動作。例如,test 階段產生 heft testheft test-watch 動作。-watch 變異是針對互動式監控模式,例如 localhost 開發伺服器。

如果工作屬於相同的階段,它們可以共用記憶體物件進行最佳化;否則,它們只能透過將檔案寫入磁碟來進行通訊。此需求支援與 Rush 階段 整合,其可能在不同的時間點或在不同的電腦上執行,透過 Rush 建置快取進行通訊。

範例:@rushstack/heft-web-rig 設定 定義 包含 webpack 工作的 build 階段。

外掛程式

Heft 外掛程式是實作 IHeftPlugin 契約的 TypeScript 類別。有兩種外掛程式

  • 工作外掛程式可以由 heft.json 工作加載並提供其實作
  • 生命週期外掛程式提供與任何工作無關的一般功能;例如收集計時指標

外掛程式封裝

「外掛程式封裝」是一種提供 Heft 外掛程式的 NPM 封裝。NPM 封裝命名模式為 heft-____-pluginheft-____-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 套件目前定義了 兩個設定檔applibrary