选择项目子集
批量命令,例如 rush build
和 rush rebuild
默认情况下会对 monorepo 中的所有项目进行操作。随着项目越来越多,这会变得很昂贵。为了加快速度,Rush 提供了一组用于选择项目子集的命令行参数。
假设我们正在使用以下 Rush 项目集合
在上图中,圆圈代表本地项目,而不是外部 NPM 依赖项。从 D
到 C
的箭头表示 D
依赖于 C
;这意味着必须先构建 C
,才能构建 D
。我们将在下面的示例中使用 rush build
命令,但这些相同的参数适用于任何批量命令。
选择参数
--to
可能的情况:假设您刚刚克隆了您的 monorepo,现在您想开始处理项目 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