Rush Stack商店部落格活動
跳到主要內容

選取專案的子集

rush buildrush rebuild 這類的批次指令預設會對單一程式碼儲存庫中的所有專案執行。隨著您累積越來越多專案,這樣做會變得非常耗費資源。為了加快速度,Rush 提供了一組命令列參數,用於選取專案的子集。

假設我們正在使用以下 Rush 專案集合

a sample monorepo

在上圖中,圓圈代表本機專案,而不是外部 NPM 相依性。從 DC 的箭頭表示 D 相依於 C;這表示必須先建置 C,才能建置 D。我們將在以下範例中使用 rush build 指令,但這些相同的參數適用於任何批次指令。

選取參數

--to

可能情境:假設您剛複製了單一程式碼儲存庫,現在想要開始處理專案 B。您需要建置 B 相依的所有項目,以及 B 本身。

以下說明如何執行此動作

# Build everything up to (and including) project B
rush build --to B

此指令選取的專案為 ABE

rush build --to B

--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

此指令選取的專案為 AE

rush build --to-except B

--from

可能情境:現在我們已完成對 B 的變更,我們想要建置下游專案 CD,以確保我們的變更沒有中斷其測試。為了建置 D,我們也需要包含其相依性 G--from 指令會執行此動作。它也會包含 AE,因為它們是 B 所需的。(由於 rush build 是增量的,假設 AE 仍然是最新的,它們可能會被略過。)

# Build everything downstream from B, including any implied dependencies
rush build --from B

此指令會選取 F 以外的所有項目

rush build --from B

相容性注意事項:如果您的 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

此指令選取的專案為 BCD

rush build --impacted-by B

--impacted-by-except (不安全)

可能情境:這與 --impacted-by 相同,只是它不包含 B 本身。例如,如果您在實作我們現在想要測試的項目時已經手動建置了 B,則這可能很合理。

# Build everything downstream from B, but don't include dependencies
rush build --impacted-by-except B

此指令選取的專案為 CD

rush build --impacted-by-except B

--only (不安全)

可能情境:顧名思義,--only 參數會只將一個專案加入選取範圍,而忽略相依性。

# Build only B and nothing else
rush build --only B
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 將會選擇 ABC
  • 請注意,Rush 不提供任何會縮減選擇範圍的參數。這是刻意的設計選擇;在 #1241 中,我們將實作個人標籤,以建立更複雜的選擇方式。

以下是一個更複雜的組合命令列範例:

rush build --only A --impacted-by-except B --to F

此範例選擇的專案為 ACDEF

rush build --only A --impacted-by-except B --to F

另請參閱