跳到主要內容

組態

Lerna 的組態分成兩個檔案:lerna.jsonnx.json

Lerna.json

npmClient

如果您沒有將 npm 用作您的套件管理員(例如,如果您正在使用 yarnpnpm),請務必設定此值,以便在解析組態和套件時 Lerna 能夠調整一些內部邏輯。在 pnpm 的情況下更是如此,因為它使用一個獨立的 pnpm-workspaces.yaml 檔案來定義其工作區組態。

packages

預設情況下,Lerna 會嘗試重複使用您從所選套件管理員中所取得的 workspaces 組態。如果您想為 Lerna 指定可操作的可用套件子集,可以使用 packages 屬性,該屬性會告訴 Lerna 到哪裡尋找 package.json 檔案。

lerna.json
{
"packages": ["packages/*"]
}

version

Lerna 有兩種發佈套件的模式:fixedindependent。使用 fixed 模式時,所有受影響的套件都將使用相同的版本發佈。最後一個發佈的版本記錄在 lerna.json 中,如下所示

lerna.json
{
"version": "1.2.0"
}

使用 independent 模式時,每個套件的版本會個別設定,而 lerna.json 如下所示

lerna.json
{
"version": "independent"
}

請參閱 版本和發佈文件 以取得更多詳細資訊。

commands

lerna.json 檔案也可以為每個指令編碼選項,如下所示

{
"command": {
"version": {
"allowBranch": "main",
"conventionalCommits": true
}
}
}

API 文件 中提供可用的選項。

Nx.json

注意:「{projectRoot}」和「{workspaceRoot}」是任務執行器支援的特殊語法,當命令執行時,它會在內部適當地內插。因此,您不應以固定的路徑取代「{projectRoot}」或「{workspaceRoot}」,因為這會讓您的組態較不靈活。

nx.json
{
"namedInputs": {
"default": ["{projectRoot}/**/*"],
"prod": ["!{projectRoot}/**/*.spec.tsx"]
},
"targetDefaults": {
"build": {
"dependsOn": ["prebuild", "^build"],
"inputs": ["prod", "^prod"],
"outputs": ["{projectRoot}/dist"],
"cache": true
},
"test": {
"inputs": ["default", "^prod", "{workspaceRoot}/jest.config.ts"],
"cache": true
}
}
}

目標預設值

目標為 npm 腳本名稱。您可以在儲存庫中的 targetDefaults 區段新增與專案的 build 腳本相關的元資料。

快取

若設為 true,將指示 Nx 快取執行腳本的結果。在大多數儲存庫中,所有非長時間執行的任務(即非 服務)都應該是可快取的。

依賴

目標可以依賴於其他目標。常見的場景是必須在建置專案之前先建置專案的依賴項。dependsOn 屬性可用於定義個別目標的依賴項。

"dependsOn": ["prebuild", "^build"] 告訴 Nx 每次建置腳本都需要先執行同個專案的 prebuild 腳本和所有依賴項的建置腳本。

輸入和已命名輸入

inputs 陣列告訴 Nx 什麼因素會影響特定腳本呼叫是否為快取命中。有 3 種類型的輸入

檔案集

範例

  • {projectRoot}/**.*.ts
  • {fileset: "{projectRoot}/**/*.ts"} 相同
  • {workspaceRoot}/jest.config.ts
  • {fileset: "{workspaceRoot}/jest.config.ts} 相同

執行階段輸入

範例

  • {runtime: "node -v"}

請注意,結果值已進行雜湊處理,因此絕不會顯示。

環境變數

範例

  • {env: "MY_ENV_VAR"}

請注意,結果值已進行雜湊處理,因此絕不會顯示。

已命名輸入

範例

  • inputs: ["prod"]
  • inputs: [{input: "prod", projects: "self"}] 相同

同一個 glob 經常會出現在多個地方(例如,prod 檔案集會排除所有專案的 spec 檔案)。由於保持它們同步並不容易,因此我們建議定義已命名輸入,然後您可以在所有那些地方參考這些輸入。

使用 ^

範例

  • inputs: ["^prod"]
  • inputs: [{input: "prod", projects: "dependencies"}] 相同

類似於 dependsOn,"^" 符號表示「依賴項」。此觀念非常重要,因此我們舉個範例來說明。

"test": {
"inputs": [ "default", "^prod" ]
}

上述設定表示測試目標依賴於給定專案的所有原始檔,以及其依賴項的 prod 原始檔(非測試原始檔)。換句話說,它將測試原始檔視為私人檔案。如果您的 remixapp 專案依賴於 header 函式庫,則變更 header 測試不會對 remixapp 測試目標造成任何影響。

輸出

"outputs": ["{projectRoot}/dist"] 告訴 Nx 建置腳本將在哪裡產生檔案人工製品。提供的值實際上就是預設值,因此我們可以在這種情況下省略它。"outputs": [] 告訴 Nx 測試目標不會在磁碟上產生任何人工製品。您可以列出任意數量的輸出。您也可以使用 glob 或個別檔案做為輸出。

通常不需要此設定。Nx 附帶合理的預設值,會實作上述設定。

專案特定設定

對於許多專案類似的 Workspace,nx.json 將包含整個 Nx 設定。有時候,最好有專案特定的設定,此設定會置於專案的 package.json 檔案中。

package.json
{
"name": "parent",
"scripts": {
"build": "...",
"test": "..."
},
"dependencies": {...},
"nx": {
"namedInputs": {
"prod": [
"!{projectRoot}/**/*.test.tsx",
"{workspaceRoot}/configs/webpack.conf.js"
]
},
"targets": {
"build": {
"dependsOn": [
"^build"
],
"inputs": [
"prod",
"^prod"
],
"outputs": [
"{workspaceRoot}/dist/parent"
]
}
}
"implicitDependencies": ["projecta", "!projectb"]
}
}

請注意,nx.json 中定義的 namedInputstargetDefaults 僅為預設值。如果您採取該組態並將其複製到每個專案的 package.json 檔案中,則結果將相同。

換句話說,每個專案都有一組已命名的輸入,並定義為:{...namedInputsFromNxJson, ...namedInputsFromProjectsPackageJson}。每個標籤/指令碼的 dependsOn 定義為 dependsOnFromProjectsPackageJson || dependsOnFromNxJsoninputsoutputs 也相同。

輸入和命名輸入

為特定標籤定義 inputs 會取代在 nx.json 中為該標籤名稱定義的輸入集。使用偽程式碼 inputs = packageJson.targets.build.inputs || nxJson.targetDefaults.build.inputs

您也可以定義和重新定義命名輸入。這啟用了其中一個關鍵使用案例,其中您的 nx.json 可定義以下內容(適用於每個專案)

"test": {
"inputs": [
"default",
"^prod"
]
}

專案可以定義其 prod 檔案集,而無需重新定義 test 標籤的輸入。

package.json
{
"name": "parent",
"scripts": {
"build": "...",
"test": "..."
},
"dependencies": {...},
"nx": {
"namedInputs": {
"prod": [
"!{projectRoot}/**/*.test.js",
"{workspacRoot}/jest.config.js"
]
}
}
}

在這種情況下,Nx 將為每個專案使用正確的 prod 輸入。

dependsOn

為特定標籤定義 dependsOn 會取代 nx.json 中為該標籤名稱定義的 dependsOn。使用偽程式碼 dependsOn = packageJson.targets.build.dependsOn || nxJson.targetDefaults.build.dependsOn

輸出

為特定標籤定義 outputs 會取代在 nx.json 中為該標籤名稱定義的 outputs。使用偽程式碼 outputs = packageJson.targets.build.outputs || nxJson.targetDefaults.build.outputs

implicitDependencies

"implicitDependencies": ["projecta", "!projectb"] 行告訴 Nx,父專案依賴於 projecta,即使其 package.json 中沒有依賴關係。Nx 將以處理明確依賴關係的方式處理此類依賴關係。它還告訴 Nx,即使明確依賴於 projectb,也應忽略它。

其他組態

有關組態任務和快取的其他方式,請參閱相關的 Nx 文件