4个版本 (稳定版)
2.0.0 | 2024年3月22日 |
---|---|
1.0.1 | 2024年3月4日 |
1.0.0 | 2024年3月1日 |
0.1.0 | 2024年2月29日 |
#155 in Cargo 插件
每月1,117次下载
53KB
1K SLoC
cargo-msrv-prep
cargo-msrv-prep 是一个Cargo子命令,用于准备确定/验证Rust crate的MSRV(最小支持的Rust版本)。
安装
通过 cargo
cargo install cargo-msrv-prep --locked
cargo binstall cargo-msrv-prep
您也可以通过从项目的发布页面下载适当的可执行文件来手动安装。
依赖项
这个工具旨在作为以下工具的伴侣(它们要酷得多)
cargo-msrv
:Cargo 命令,用于确定crate的MSRVcargo-hack
:Cargo 命令,提供测试和CI工具cargo-minimal-versions
:Cargo 命令,用于获取最小依赖项(使用上面的cargo-hack
)
如果您还没有安装这些工具,可以访问它们的GitHub页面了解如何安装。
用法
确定Rust crate的最低支持Rust版本并不容易。 cargo-msrv
工具就是为了这个目的设计的,它允许使用多个Rust版本运行检查命令(默认为 cargo check
),直到找到MSRV。然而,这个方法有几个问题
- 如果您的crate包含一个
rust-version
字段,它将不允许cargo-msrv
“看到”一个工作的较低MSRV。 - 为了确定真正的MSRV,您需要使用所有依赖项(递归)的最低支持的版本进行构建,但这不是Cargo的默认行为。
第二个问题可以通过使用一个名为cargo-minimal-versions
的巧妙工具部分规避。它允许使用不稳定的-Z minimal-versions
选项运行Cargo命令来获取依赖项的最低版本。通过使用它,我们可以运行这个命令来确定我们crate的真正MSRV
cargo msrv -- cargo minimal-versions check --workspace --lib --bins --all-features
但还有一个问题:一些crate为它们的依赖项指定了错误的最小版本;指定的小版本实际上太低,无法构建。有时,这是因为依赖项指定的最小版本太旧,曾经可以构建,但现在由于各种原因(例如,当该版本的依赖项是在Rust 1.0之前创建的时)不再可以构建。有时,这也可以是因为crate的作者指定了一个曾经可以工作但现在不再工作的小版本依赖项,因为他们使用了依赖项后来引入的功能,但由于Cargo总是拉取依赖项的最新版本,crate的作者没有注意到。(这也是为什么使用CI检查crate的MSRV是否仍然正确是一个好主意的原因。)
不幸的是,最后一个问题是“不可解决的”——由于它们已经发布并固定,无法修改有缺陷的依赖项。唯一的解决方案是通过工作区的Cargo.toml
文件将一些有缺陷的依赖项“锁定”到更近的版本。
这就是cargo-msrv-prep
出现的地方。它加载一个清单(Cargo.toml
文件)并执行两件事
- 如果清单有一个
rust-version
字段(在package
表中),它将被删除 - 如果存在名为
msrv-pins.toml
的文件与清单相邻,则该文件中指定的依赖项将与清单中的依赖项合并
例如,如果您的项目有这个Cargo.toml
文件和这个msrv-pins.toml
文件,运行cargo msrv-prep
将生成这个输出(替换Cargo.toml
文件)。
(可以覆盖msrv-pins.toml
文件的名称,更改备份文件的扩展名等。运行cargo msrv-prep --help
获取所有选项。)
运行cargo-msrv-prep
将备份所有修改后的清单。还提供了一个名为cargo-msrv-unprep
的Cargo命令来反转此过程。
因此,您可以使用此工具来确定crate的真正MSRV,而无需手动修改Cargo.toml
文件,只需运行
cargo msrv-prep --workspace
cargo msrv -- cargo minimal-versions check --workspace --lib --bins --all-features
cargo msrv-unprep --workspace
为了验证在您的crate清单中指定的MSRV是否正确,您可以使用cargo-msrv-prep
,如下所示
cargo msrv-prep --workspace
cargo minimal-versions check --workspace --lib --bins --all-features
这是一个在CI中执行此验证的GitHub工作流的示例。此工作流使用taiki-e/install-action
来安装所需的工具。
name: MSRV check
on: [push]
jobs:
msrv-check:
name: MSRV check for Rust ${{ matrix.toolchain }} on ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
toolchain: [ 1.74.1 ] # Set this to the expected MSRV of your crate
os: [ ubuntu, macos, windows ] # It's probably a good idea to run this check on all supported OSes
runs-on: ${{ matrix.os }}-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust nightly toolchain # Required for `cargo-minimal-versions` to work
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: nightly
cache: false
- name: Install Rust minimum supported toolchain
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: ${{ matrix.os }}
cache: false
# If you want to use the `rust-cache` action, it's probably a good idea to make your cache key
# conditional on the `msrv-pins.toml` file(s) since they will affect the resulting build
- name: Rust Cache
uses: Swatinem/rust-cache@v2
with:
key: msrv-pins-files-${{ hashFiles('**/msrv-pins.toml') }}
- name: Install required tools
uses: taiki-e/install-action@v2
with:
tool: cargo-hack,cargo-minimal-versions,cargo-msrv-prep
- name: Run checks using cargo-minimal-versions
run: |
cargo msrv-prep --workspace
cargo minimal-versions check --workspace --lib --bins --all-features
cargo-msrv-prep
的MSRV
cargo-msrv-prep
工具的MSRV是Rust 1.74.1。这仅在从源代码安装时(例如,使用cargo install
)很重要,因为可执行文件将能够与较旧的Rust版本一起工作。
依赖项
~3.5–4.5MB
~85K SLoC