Rush Stack商店博客活动
跳至主要内容

选择项目子集

批量命令,例如 rush buildrush rebuild 默认情况下会对 monorepo 中的所有项目进行操作。随着项目越来越多,这会变得很昂贵。为了加快速度,Rush 提供了一组用于选择项目子集的命令行参数。

假设我们正在使用以下 Rush 项目集合

a sample monorepo

在上图中,圆圈代表本地项目,而不是外部 NPM 依赖项。从 DC 的箭头表示 D 依赖于 C;这意味着必须先构建 C,才能构建 D。我们将在下面的示例中使用 rush build 命令,但这些相同的参数适用于任何批量命令。

选择参数

--to

可能的情况:假设您刚刚克隆了您的 monorepo,现在您想开始处理项目 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

另请参见