工作區

使用工作區

選擇 CLI 版本

說明

工作區是一個通用的術語,用於指稱 npm cli 中的一組功能,這些功能提供支援,讓您可以在單一頂層根套件中從您的本機檔案系統管理多個套件。

這組功能可大幅簡化處理本機檔案系統中連結套件的工作流程。它會自動將連結程序納入 npm install 的一部分,並移除手動使用 npm link 的需求,才能將參考加入應該符號連結到目前 node_modules 資料夾的套件。

我們也會在 npm install 中將這些套件自動連結到單一工作區,表示它是 package.json workspaces 設定中明確定義的當前本機檔案系統內的巢狀套件。

定義工作區

工作區通常透過 package.json 檔案的 workspaces 屬性定義,例如

{
"name": "my-workspaces-powered-project",
"workspaces": ["packages/a"]
}

假設上述 package.json 範例位於當前工作目錄 .,其中包含一個名為 packages/a 的資料夾,而該資料夾本身包含一個 package.json,定義一個 Node.js 套件,例如

.
+-- package.json
`-- packages
+-- a
| `-- package.json

在這個當前工作目錄 . 執行 npm install 後預期的結果是 packages/a 資料夾會連結到當前工作目錄的 node_modules 資料夾。

以下是 npm install 後的範例,假設檔案和資料夾結構與先前範例相同

.
+-- node_modules
| `-- a -> ../packages/a
+-- package-lock.json
+-- package.json
`-- packages
+-- a
| `-- package.json

開始使用工作區

你可以使用 npm init 自動執行定義新工作區所需的步驟。例如,在已經定義 package.json 的專案中,你可以執行

npm init -w ./packages/a

這個指令會建立遺失的資料夾和新的 package.json 檔案(如果需要),同時也會正確設定根專案 package.json"workspaces" 屬性。

將相依性加入工作區

你可以使用 workspace 設定 直接新增/移除/更新工作區的相依性。

例如,假設有以下結構

.
+-- package.json
`-- packages
+-- a
| `-- package.json
`-- b
`-- package.json

如果你想要新增一個名為 abbrev 的相依性(從註冊表中)作為你的工作區 a 的相依性,你可以使用工作區設定告訴 npm 安裝程式應該將該套件新增為所提供工作區的相依性

npm install abbrev -w a

注意:其他安裝指令,例如 uninstallci 等,也會尊重所提供的 workspace 設定。

使用工作區

根據 Node.js 處理模組解析的具體方式,你可以透過宣告的 package.json name 來使用任何已定義的工作區。繼續上述範例,我們也可以建立一個 Node.js 腳本,它會需要工作區 a 範例模組,例如

// ./packages/a/index.js
module.exports = 'a'
// ./lib/index.js
const moduleA = require('a')
console.log(moduleA) // -> a

使用以下方式執行時

node lib/index.js

這說明了 node_modules 解析的本質如何允許 工作區 為每個 工作區 啟用可攜式工作流程,以便以一種容易 發布 這些嵌套工作區供其他地方使用的方式進行要求。

在工作區的環境中執行指令

你可以使用 workspace 組態選項在組態工作區的內容中執行命令。此外,如果你的目前目錄在工作區中,workspace 組態會隱含設定,而 prefix 會設定為根工作區。

以下是關於如何在嵌套工作區的內容中使用 npm run 命令的快速範例。對於包含多個工作區的專案,例如

.
+-- package.json
`-- packages
+-- a
| `-- package.json
`-- b
`-- package.json

透過使用 workspace 選項執行命令,可以在特定工作區的內容中執行給定的命令。例如

npm run test --workspace=a

你也可以在工作區中執行命令。

cd packages/a && npm run test

這兩個都會執行在 ./packages/a/package.json 檔案中定義的 test 指令碼。

請注意,你也可以在命令列中多次指定這個引數,以鎖定多個工作區,例如

npm run test --workspace=a --workspace=b

或為「packages」資料夾中的每個工作區執行命令

npm run test --workspace=packages

也可以使用 workspaces(複數)組態選項來啟用相同的行為,但會在 所有 組態工作區的內容中執行該命令。例如

npm run test --workspaces

會在 ./packages/a./packages/b 中執行 test 指令碼。

命令會按照它們在 package.json 中出現的順序在每個工作區中執行

{
"workspaces": [ "packages/a", "packages/b" ]
}

執行順序與以下不同

{
"workspaces": [ "packages/b", "packages/a" ]
}

忽略遺失的指令碼

並非所有工作區都必須實作使用 npm run 指令執行的腳本。

透過使用 --if-present 旗標執行指令,npm 會忽略缺少目標腳本的工作區。

npm run test --workspaces --if-present

另請參閱