選取專案的子集
像 rush build
和 rush rebuild
這類的批次指令預設會對單一程式碼儲存庫中的所有專案執行。隨著您累積越來越多專案,這樣做會變得非常耗費資源。為了加快速度,Rush 提供了一組命令列參數,用於選取專案的子集。
假設我們正在使用以下 Rush 專案集合
在上圖中,圓圈代表本機專案,而不是外部 NPM 相依性。從 D
到 C
的箭頭表示 D
相依於 C
;這表示必須先建置 C
,才能建置 D
。我們將在以下範例中使用 rush build
指令,但這些相同的參數適用於任何批次指令。
選取參數
--to
可能情境:假設您剛複製了單一程式碼儲存庫,現在想要開始處理專案 B
。您需要建置 B
相依的所有項目,以及 B
本身。
以下說明如何執行此動作
# Build everything up to (and including) project B
rush build --to B
此指令選取的專案為 A
、B
和 E
--to-except
可能情境:在許多情況下,我們不需要 rush build
處理 B
,因為我們的下一步將針對 B
叫用 Webpack 或 Jest 的「監看模式」。您可以使用 --to-except
而不是 --to
來排除 B
。
# Build everything up to project B, but not B itself
rush build --to-except B
# Invoke Jest watch mode to build B
heft test --watch
此指令選取的專案為 A
和 E
--from
可能情境:現在我們已完成對 B
的變更,我們想要建置下游專案 C
和 D
,以確保我們的變更沒有中斷其測試。為了建置 D
,我們也需要包含其相依性 G
。--from
指令會執行此動作。它也會包含 A
和 E
,因為它們是 B
所需的。(由於 rush build
是增量的,假設 A
和 E
仍然是最新的,它們可能會被略過。)
# Build everything downstream from B, including any implied dependencies
rush build --from B
此指令會選取 F
以外的所有項目
相容性注意事項:如果您的 rush.json 中的
rushVersion
設定早於 5.38.0,則--from
的行為會類似於--impacted-by
。Rush 5.38.0 中變更了其意義,因為大多數使用者期望--from
包含相依性。
--impacted-by (不安全)
可能情境:假設在處理 B
時,我們對 E
進行了一些變更。rush build
增量分析假設對 E
的任何變更都要求重新建置其所有下游相依項目,包括例如 F
。這可能是一大組。也許您更清楚情況 - 也許您稍後還原了在 E
中的變更,或者您手動叫用了工具鏈,因此 E
狀態良好,或者您對 E
的變更目前無關緊要。
在這些情況下,--impacted-by
參數可能會很方便:這表示「只選取可能因對 B 進行變更而中斷的那些專案,並相信我,它們的相依性處於可用狀態。」
# Build B and everything downstream from B, but don't include dependencies
rush build --impacted-by B
此指令選取的專案為 B
、C
和 D
--impacted-by-except (不安全)
可能情境:這與 --impacted-by
相同,只是它不包含 B
本身。例如,如果您在實作我們現在想要測試的項目時已經手動建置了 B
,則這可能很合理。
# Build everything downstream from B, but don't include dependencies
rush build --impacted-by-except B
此指令選取的專案為 C
和 D
--only (不安全)
可能情境:顧名思義,--only
參數會只將一個專案加入選取範圍,而忽略相依性。
# Build only B and nothing else
rush build --only B
當與其他參數組合時,--only
參數最有用。例如,在我們上述的敘述中,當我們執行 rush build --impacted-by B
時,也許我們還沒有實際建置 G
。我們可以透過執行 rush build --impacted-by B --only G
來包含它。
「不安全」參數:如果未建置所需的相依性,參數
--only
、--impacted-by
和--impacted-by-except
都可能會失敗。這三個參數會假設您比 Rush 更清楚真正需要建置的內容,藉此節省時間。如果該假設不正確,您隨時可以執行rush build
來恢復到良好狀態。
選取器
當您使用選取參數 (例如 rush build --to X
) 時,引數 X
稱為選取器。在上述討論中,我們假設選取器始終是單一 Rush 專案的名稱。Rush 支援各種其他選取器語法,其中有些選取器語法可以參考一個以上的 Rush 專案。
專案名稱
最簡單的選取器是 Rush 專案的全名,也就是來自 package.json 的 "name"
欄位。
範例
rush build --to @my-company/my-project-name
rush build --from @my-company/my-project-name
rush list --impacted-by @my-company/my-project-name
如果套件名稱包含 NPM 範圍 (例如 @my-company
),Rush 允許您為了簡潔起見而省略範圍 (只要無範圍名稱沒有被工作區中的其他專案使用)。
範例
rush build --to my-project-name
rush build --from my-project-name
rush list --impacted-by my-project-name
一般而言,@my-company/my-project-name
的磁碟資料夾也會稱為 my-project-name
,我們強烈建議這樣做以避免混淆。務必了解,此選取器不符合磁碟資料夾。
目前資料夾:.
包含 Rush 專案 package.json 檔案的資料夾稱為專案資料夾。如果您的 Shell 的目前工作目錄位於專案資料夾下的某個位置,則選取器 .
可提供方便的簡寫方式來參考該專案。
範例
cd my-project-name
# Build "@my-company/my-project-name" whose package.json
# is in the current working directory
rush build --to .
cd src
# The "." selector can also be resolved from a subfolder
# such as my-project-name/src
rush list --to-except .
已修改的專案:git:
藉由提供 Git 參考運算式 (分支、標籤或認可雜湊),您可以選取自對應認可以來經過修改的所有專案。此類型的查詢使用與 rush change
指令類似的邏輯:Rush 會計算目前工作目錄與參考認可的 git diff
,然後計算受影響的檔案路徑清單。這些檔案路徑會與來自 rush.json 工作區的專案資料夾進行比對:以此方式,git:
選取器會識別至少有一個已修改檔案的 Rush 專案集合。
# Select projects whose source code has been changed according to Git,
# using the "main" branch as the basis for comparison.
# Build "--to" those projects and their dependencies.
rush build --to git:origin/main
# Select projects whose source code has been changed since
# the Git tag named "release/v3.0.0".
# List the downstream projects that would be "impacted by" these changes.
rush list --impacted-by git:release/v3.0.0
子空間成員:subspace:
子空間功能可讓 Rush 專案分組到使用其自己的 PNPM 鎖定檔進行安裝的子空間中。subspace:
選取器會比對屬於指定子空間的所有專案。
範例
# Build all projects belonging to the "install-test" subspace, as well
# as their dependencies:
rush build --to subspace:install-test
已標記的專案:tag:
Rush 專案標籤可讓您定義專案的任意集合,然後可以使用 tag:
選取器來參考這些專案。
範例
# Build all projects that were tagged with the "shipping" project tag.
rush build --to tag:shipping
# Print a report showing the set of projects
# that have the "frontend-team-libs" project tag.
rush list --only tag:frontend-team-libs --detailed
合併參數
- 您可以在單個命令列上組合任何選擇參數。結果永遠是每個個別選擇的聯集。
- 可以多次指定相同的參數。例如:
rush build --only A --only B --only C
將會選擇A
、B
和C
。 - 請注意,Rush 不提供任何會縮減選擇範圍的參數。這是刻意的設計選擇;在 #1241 中,我們將實作個人標籤,以建立更複雜的選擇方式。
以下是一個更複雜的組合命令列範例:
rush build --only A --impacted-by-except B --to F
此範例選擇的專案為 A
、C
、D
、E
和 F
。