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

安装变体

有时您可能希望使用一组修改后的依赖项来构建整个单体仓库。例如,假设您刚刚完成了一个主要框架新版本的升级,但您打算在过渡期间保持与先前版本的兼容性。您的开发人员应该在日常工作中使用新变体,但对于 PR 构建,您希望您的 CI 作业两次构建整个仓库 - 一次使用旧变体,一次使用新变体。

看起来您可以通过编写一个简单的脚本在您的 **package.json** 文件中搜索和替换版本来解决此问题,但您很快会遇到其他受影响的文件

  • **shrinkwrap 文件**: 除非您为这两个变体维护单独的 shrinkwrap 文件,否则构建将不确定
  • **common-versions.json**: preferredVersionsallowedAlternativeVersions 可能需要针对这两个变体有所不同
  • **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"
}