Rush StackShopBlogEvents
跳至主要內容

使用 rig 套件

在大型環境中,許多專案使用完全相同的 Heft 設定都能帶來好處。或許有些微小的差異,例如 Node.js 專案可指出 CommonJS 模組,但 Web 應用程式專案可能需要指出 ESNext 模組。但通常而言,極少數的 common「設定檔」即可適用於大多數專案。@rushstack/rig-package 系統提供規範化的機制,可將常見設定移至 NPM 套件,而此套件會加入使用該套件專案的「開發人員相依性」。這稱為rig 套件。請注意,數個不同的rig 設定檔可能來自同一 NPM 套件;各個設定檔都是包含一組設定檔資料夾。

一些具體範例

Heft 也提供兩個可在專案中使用的標準 rig 套件

遵循這些範例,也能輕鬆定義自己的自訂 rig 套件。

heft-node-rig-tutorial 範例專案說明如何使用 @rushstack/heft-node-rig

裝配原則

@rushstack/rig-package」定義了「rig.json」設定檔中解析檔案路徑的 API,但只有「裝備」的概念。要將裝備後置到現有工具中需要額外的邏輯,而且可能需要具有不同的實作才能支援不同的工具。Heft 已針對其官方外掛程式實作了這類邏輯,但如果你有專案使用 Heft 以外的其他工具鏈,可以透過複製與 Heft 相同的作法來讓它們支援裝備。

裝備包含三項不同的功能

1.「延伸」的基本檔案

許多設定檔提供繼承參照自其他檔案的共用設定的能力,這是從裝備中重複使用組態的簡單方式。例如在我們的範例專案中,TypeScript 組態已簡化為僅有幾行

heft-node-rig-tutorial/tsconfig.json

{
"extends": "./node_modules/@rushstack/heft-node-rig/profiles/default/tsconfig-base.json",
"compilerOptions": {
"types": ["heft-jest", "node"]
}
}

大部分設定來自「預設」設定檔中的 tsconfig-base.json。但是我們本機的 tsconfig.json 檔案可以視需要新增自訂設定,例如「型別」。

下列設定檔均支援一個名為 "extends" 的欄位,這個欄位可讓設定繼承自其他 NPM 套件

  • .eslintrc.js,適用於「lint 任務」,前提是使用 @rushstack/eslint-patch 解決方案或 @rushstack/eslint-config 規則集(其中包含這個解決方案)
  • config/api-extractor.json,適用於「api-extractor 任務」
  • config/jest.config.json,適用於「jest 任務」;Jest 通常使用 "preset" 欄位進行繼承,不過它有一些問題,所以 Heft 會使用 @rushstack/heft-config-file 引擎取代 Jest 的設定載入器,然後再使用 "extends" 取代 "preset"。在其他所有方面,這個檔案採用標準的 Jest 格式。
  • tsconfig.json,適用於「typescript 任務」
  • webpack.config.js 沒有明確支援繼承,但它作為一個 JavaScript 模組可以呼叫 require() 載入共用設定。

2. 可裝備設定檔

儘管 "extends" 可以縮減檔案大小,卻無法完全移除它們。rig.json 檔案可以完全移除大部分 Heft 設定檔。我們稱這種檔案為「可裝備」設定檔。以下是 heft-node-rig-tutorial 專案的範例

heft-node-rig-tutorial/config/rig.json

// The "rig.json" file directs tools to look for their config files in an external package.
// Documentation for this system: https://www.npmjs.com/package/@rushstack/rig-package
{
"$schema": "https://developer.microsoft.com/json-schemas/rig-package/rig.schema.json",

/**
* (Required) The name of the rig package to inherit from.
* It should be an NPM package name with the "-rig" suffix.
*/
"rigPackageName": "@rushstack/heft-node-rig"

/**
* (Optional) Selects a config profile from the rig package. The name must consist of
* lowercase alphanumeric words separated by hyphens, for example "sample-profile".
* If omitted, then the "default" profile will be used."
*/
// "rigProfile": "your-profile-name"
}

rig.json 檔案會告知 Heft,若在 heft-node-rig-tutorial/config 中找不到檔案,請嘗試在 @rushstack/heft-node-rig/profiles/default/common 資料夾中尋找。

「可裝備」設定檔範例

  • <專案資料夾>/config/api-extractor-task.json
  • <專案資料夾>/config/heft.json
  • <專案資料夾>/config/typescript.json

我們無法完全移除 tsconfig.json,因為 VS Code 等工具預期會在專案資料夾的根目錄中找到這個檔案。另外還有一些檔案也是如此,例如 .eslintrc.js。在本網站中,每個設定檔的文件會說明它是否可裝備。

3. 可裝備相依性

裝備套件也可以提供 NPM 相依性,以避免必須將它們指定為專案的「開發相依性」。由下列裝備套件提供的工具套件(前提是它們不需要為某個其他專案相依性的「同儕相依性」)

  • @microsoft/api-extractor
  • eslint
  • jest 與其相關套件
  • tslint
  • typescript
  • webpack 與其載入器及外掛程式

藉由 Rig 提供相依項是可選的。您本機專案的 devDependencies 優先於 Rig。

Heft 使用下列程序獨立解析每個可組裝的工具

  1. 如果工具套件列在本機專案的 devDependencies 中,則會從目前專案資料夾中解析工具。(此步驟不會考量 dependenciespeerDependencies。)

  2. 否則,如果目前專案有 rig.json 檔案,而且 Rig 的 package.json 在其 dependencies 中列出工具,則會從 Rig 套件資料夾中解析工具。(此步驟不會考量 devDependenciespeerDependencies。)

  3. 否則,會從目前專案資料夾中解析工具。如果在那裡找不到工具,則會回報錯誤。

請另見