安装变体
有时您可能希望使用一组修改后的依赖项来构建整个单体仓库。例如,假设您刚刚完成了一个主要框架新版本的升级,但您打算在过渡期间保持与先前版本的兼容性。您的开发人员应该在日常工作中使用新变体,但对于 PR 构建,您希望您的 CI 作业两次构建整个仓库 - 一次使用旧变体,一次使用新变体。
看起来您可以通过编写一个简单的脚本在您的 **package.json** 文件中搜索和替换版本来解决此问题,但您很快会遇到其他受影响的文件
- **shrinkwrap 文件**: 除非您为这两个变体维护单独的 shrinkwrap 文件,否则构建将不确定
- **common-versions.json**:
preferredVersions
或allowedAlternativeVersions
可能需要针对这两个变体有所不同 - **pnpmfile.js**: 如果您有针对行为不当的旧版包的解决方法,它们可能需要针对这两个变体有所不同
此问题似乎需要一组单独的并行配置文件。从 Rush 5.4.0 开始,现在为此问题提供了一个开箱即用的解决方案。
设置变体
假设“**widget-sdk**”是一个假设的库,它刚刚发布了主要的新版本 3,我们已升级到版本 3,但我们希望保持与版本 2 的兼容性。我们可以使用我们的 **package.json** 文件中的松散 SemVer 范围来指示这一点
libraries/my-controls/package.json
{
"name": "my-controls",
"version": "1.0.0",
"description": "An example library project",
"license": "MIT",
"main": "lib/index.js",
"typings": "lib/index.d.ts",
"scripts": {
"build": "node_modules/.bin/my-build"
},
"dependencies": {
"widget-sdk": "^2.3.4 || ^3.0.2"
},
"devDependencies": {
"my-toolchain": "^1.0.0",
"typescript": "^3.0.3"
}
}
"^2.3.4 || ^3.0.2"
范围表示我们的库将接受 **widget-sdk** 版本 2.x(但不能早于 2.3.4)或版本 3.x(但不能早于 3.0.2)。当您运行 rush update
时,您通常会获得最新的兼容版本。如何使用旧版本 2 构建和测试?让我们设置一个变体!
**1. 定义您的变体。**在 rush.json 配置文件中,我们添加了类似于以下的定义
**rush.json** 摘录*
"variants": [
// {
// /**
// * The folder name for this variant.
// */
// "variantName": "example-variant",
//
// /**
// * An informative description
// */
// "description": "Build this repo using the previous release of the SDK"
// }
{
"variantName": "old-widget-sdk",
"description": "Build this repo using version 2 of the widget-sdk"
}
],
**2. 复制配置文件。**要开始使用您的变体,请将现有的配置文件从 **common/config/rush** 复制到您的变体文件夹 **common/config/rush/variants/old-widget-sdk**。目前支持三种配置文件(将来可能会添加其他文件)
- **shrinkwrap.yaml**、**npm-shrinkwrap.json** 或 **yarn.lock**(具体取决于您的包管理器)
- common-versions.json
- **pnpmfile.js**(如果您使用 PNPM 作为您的包管理器)
确保将复制的文件添加到 Git
git add .
git commit -m "Creating a new variant"
**3. 覆盖变体的依赖项版本。**对于此示例,我们将降级 **widget-sdk** 以使用版本 2.x。这可以通过使用 Rush 的 首选版本 功能来完成。我们将使用通配符,以便 rush update --full
仍然可以获取次要/修补版本
**common-versions.json** 摘录*
/**
* A table that specifies a "preferred version" for a dependency package. The "preferred version"
* is typically used to hold an indirect dependency back to a specific version, however generally
* it can be any SemVer range specifier (e.g. "~1.2.3"), and it will narrow any (compatible)
* SemVer range specifier. See the Rush documentation for details about this feature.
*/
"preferredVersions": {
/**
* When someone asks for "^1.0.0" make sure they get "1.2.3" when working in this repo,
* instead of the latest version.
*/
// "some-library": "1.2.3"
"widget-sdk": "^2.3.9"
},
请注意,^2.3.9
满足我们在上面的 **package.json** 中指定的 SemVer 范围 ^2.3.4 || ^3.0.2
。(如果这不是真的,那么首选版本将没有任何效果!)
**4. 安装您的变体并测试它。**让我们先运行 rush update
来安装新的依赖项版本集
rush update --full --variant old-widget-sdk
这将更新文件 **common/config/rush/old-widget-sdk/shrinkwrap.yaml**,在 **common/temp/node_modules** 中安装这些依赖项,并将每个项目链接到使用这些依赖项。rush install
命令还支持 --variant
选项。您的 CI 作业可以在使用旧的 **widget-sdk** 版本构建时使用此选项。
现在您可以构建和测试您的变体
rush rebuild
👉 如果您厌倦了键入 --variant
,您还可以使用 RUSH_VARIANT 环境变量来指定变体名称。
**5. 恢复原始状态。**完成对变体的测试后,您可以通过在不使用 --variant
选项的情况下运行 rush install
来恢复原始状态。我们称之为“**默认变体**”,因为它与未定义任何变体的仓库的默认行为相同
# Restore the original state by omitting "--variant":
rush install
**提示:**如果您忘记了哪个变体处于活动状态,您可以在 **common/temp/current-variant.json** 文件中查看。如果您在文本编辑器中打开此文件,您应该会看到类似于以下的代码行
{
"variant": "old-widget-sdk"
}