跳到主要內容

工作區

什麼是工作區?

工作區是屬於同一個專案的個別套件名稱,Yarn 會安裝並連結它們以簡化交叉參照。

當與儲存庫一起使用時,這種模式通常稱為單一儲存庫。工作區最初由 Lerna 等專案普及,但 Yarn 是第一個提供原生支援的套件管理員,而這種支援在我們建立更多周邊功能的過程中,從未停止過改善。

資訊

我們總是試著使用我們提供的功能,而工作區是一個很好的例子:Yarn 由數十個套件組成,如果需要,每個套件都可以獨立部署!

何時應該使用工作區?

工作區在許多情況下都非常有用,主要情況包括

  • 當專案有一個核心套件,並有各種附加元件時;例如 Babel 的情況。

  • 當您需要發布多個套件,並希望避免貢獻者在每次想要變更時,都必須在許多獨立儲存庫上開啟 PR。例如 Jest 的情況。

  • 或者當專案想要在程式碼中保持嚴格的界線,並避免變成糾纏的單體。例如 Yarn 本身,或許多企業程式碼庫的情況。

關於單一儲存庫的好壞,一直有大量的討論,雙方都有合理的論點。我們的團隊多年來一直使用單一儲存庫,而透過 Yarn 提供的工具,其價值始終遠遠大於缺點。如果您需要為專案建立另一個套件,請考慮將它們分組在一起是否有意義。

提示

您不需要將程式碼拆分到許多工作區,才能讓它們變得有用。例如,Clipanion 儲存庫只使用兩個工作區,一個用於程式庫,另一個用於其網站。這種模式避免了混用相依性,同時也讓撰寫影響程式碼和文件的文件變得容易。

工作區是如何宣告的?

要宣告工作區,您只需在根目錄的 package.json 檔案中新增一個 workspaces 陣列,並列出指向工作區資料夾的相對 glob 模式。在以下範例中,packages 資料夾中的所有子目錄都將成為工作區。

{
"workspaces": [
"packages/*"
]
}

限制

限制對單一儲存庫來說就像 Eslint 對您的原始碼一樣。它們讓您宣告必須套用於專案中特定工作區的規則。例如,您可以使用限制來強制執行專案中的所有相依性都必須同步,以防止使用某些相依性,或強制執行某些欄位(例如 licenseengines.node)在各處都正確設定。

如需有關限制的更多資訊和範例,請查看 專門文章

交叉參照

來自單一儲存庫的套件通常需要彼此相依 - 例如,當您有一個應用程式套件相依於一個獨立的函式庫時。Yarn 讓這變得非常容易,這要歸功於特殊的 workspace: 協定,它讓您可以指示 Yarn 使用專案中同名的工作區來解析相依性。例如

{
"dependencies": {
"@my-org/utils": "workspace:^"
}
}

workspace: 協定接受常規 semver 範圍或特殊的 ^ / ~ / * 權杖。無論值為何,都不會改變 Yarn 解析相依性的方式(它只會關注相依性名稱),但它會影響套件透過 yarn npm publish 發佈後相依性的外觀。例如,如果針對工作區使用下列範圍,其 version 欄位設定為 3.2.1

初始範圍發佈後的範圍
工作區:^3.0.0^3.0.0
工作區:^^3.2.1
工作區:~~3.2.1
工作區:*=3.2.1

重點安裝

在探索工作區時,一個常見的問題是,當您想要處理其中一個工作區時,您需要安裝其所有依賴項。Yarn 提供一個解決方案,透過 yarn workspaces focus

此指令會取得工作區清單,將清單延伸至包含傳遞性依賴項,並從安裝中排除其他所有內容。例如,下列指令將讓您僅安裝主應用程式建置和部署所需的依賴項

yarn workspaces focus @my-org/app

如果您也想要略過安裝 devDependencies,請設定 --production 旗標。在下列範例中,Yarn 會安裝所有工作區的依賴項,但僅安裝生產依賴項

yarn workspaces focus -A --production

全域指令碼

package.json 檔案的 scripts 欄位中定義的指令碼可以使用 yarn run name 執行,但前提是您從宣告這些指令碼的工作區內執行指令。也就是說,除非它們是全域指令碼。

全域指令碼的特徵是在指令碼名稱中至少有一個冒號 (:)。只要專案中沒有重複的指令碼(如果兩個工作區定義名稱相同的指令碼,它們不會升級為全域指令碼),就可以從專案中的任何位置執行這些指令碼。

平行執行

如果多個工作區的指令碼名稱相同,可以使用 yarn workspaces foreach,讓這些指令碼平行執行。下列範例顯示如何平行發佈專案中的所有套件,但會遵循拓撲順序(因此,只有在所有其他依賴工作區都發佈後,工作區才會發佈一次)

yarn workspaces foreach --all -pt npm publish

--all 標記將在專案的每個工作區執行提供的指令,但可以調整。在此範例中,我們使用 --since 標記,以僅選取與 主分支 相較之下在目前分支中已修改的工作區

yarn workspaces foreach --since run lint

類似地,--from pattern 標記將選取所有符合所提供 glob 模式的工作區。至於所有其他 Yarn 指令,此標記將套用至工作區名稱和相對於目前工作目錄的路徑。例如,此指令將在目前工作區和所有其他它依賴的工作區執行 build 腳本

yarn workspaces foreach --from . -R run build