工作區
什麼是工作區?
工作區是屬於同一個專案的個別套件名稱,Yarn 會安裝並連結它們以簡化交叉參照。
當與儲存庫一起使用時,這種模式通常稱為單一儲存庫。工作區最初由 Lerna 等專案普及,但 Yarn 是第一個提供原生支援的套件管理員,而這種支援在我們建立更多周邊功能的過程中,從未停止過改善。
我們總是試著使用我們提供的功能,而工作區是一個很好的例子:Yarn 由數十個套件組成,如果需要,每個套件都可以獨立部署!
何時應該使用工作區?
工作區在許多情況下都非常有用,主要情況包括
-
當專案有一個核心套件,並有各種附加元件時;例如 Babel 的情況。
-
當您需要發布多個套件,並希望避免貢獻者在每次想要變更時,都必須在許多獨立儲存庫上開啟 PR。例如 Jest 的情況。
-
或者當專案想要在程式碼中保持嚴格的界線,並避免變成糾纏的單體。例如 Yarn 本身,或許多企業程式碼庫的情況。
關於單一儲存庫的好壞,一直有大量的討論,雙方都有合理的論點。我們的團隊多年來一直使用單一儲存庫,而透過 Yarn 提供的工具,其價值始終遠遠大於缺點。如果您需要為專案建立另一個套件,請考慮將它們分組在一起是否有意義。
您不需要將程式碼拆分到許多工作區,才能讓它們變得有用。例如,Clipanion 儲存庫只使用兩個工作區,一個用於程式庫,另一個用於其網站。這種模式避免了混用相依性,同時也讓撰寫影響程式碼和文件的文件變得容易。
工作區是如何宣告的?
要宣告工作區,您只需在根目錄的 package.json
檔案中新增一個 workspaces
陣列,並列出指向工作區資料夾的相對 glob 模式。在以下範例中,packages
資料夾中的所有子目錄都將成為工作區。
{
"workspaces": [
"packages/*"
]
}
與工作區相關的功能
限制
限制對單一儲存庫來說就像 Eslint 對您的原始碼一樣。它們讓您宣告必須套用於專案中特定工作區的規則。例如,您可以使用限制來強制執行專案中的所有相依性都必須同步,以防止使用某些相依性,或強制執行某些欄位(例如 license
或 engines.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
。
此指令會取得工作區清單,將清單延伸至包含傳遞性依賴項,並從安裝中排除其他所有內容。例如,下列指令將讓您僅安裝主應用程式建置和部署所需的依賴項
如果您也想要略過安裝 devDependencies
,請設定 --production
旗標。在下列範例中,Yarn 會安裝所有工作區的依賴項,但僅安裝生產依賴項
全域指令碼
在 package.json
檔案的 scripts
欄位中定義的指令碼可以使用 yarn run name
執行,但前提是您從宣告這些指令碼的工作區內執行指令。也就是說,除非它們是全域指令碼。
全域指令碼的特徵是在指令碼名稱中至少有一個冒號 (:
)。只要專案中沒有重複的指令碼(如果兩個工作區定義名稱相同的指令碼,它們不會升級為全域指令碼),就可以從專案中的任何位置執行這些指令碼。
平行執行
如果多個工作區的指令碼名稱相同,可以使用 yarn workspaces foreach
,讓這些指令碼平行執行。下列範例顯示如何平行發佈專案中的所有套件,但會遵循拓撲順序(因此,只有在所有其他依賴工作區都發佈後,工作區才會發佈一次)
--all
標記將在專案的每個工作區執行提供的指令,但可以調整。在此範例中,我們使用 --since
標記,以僅選取與 主分支 相較之下在目前分支中已修改的工作區
類似地,--from pattern
標記將選取所有符合所提供 glob 模式的工作區。至於所有其他 Yarn 指令,此標記將套用至工作區名稱和相對於目前工作目錄的路徑。例如,此指令將在目前工作區和所有其他它依賴的工作區執行 build
腳本