#cargo #cargo-toml #cargo-subcommand #testing #cargo-build #manifest-file #subcommand

bin+lib cargo-msrv-prep

Cargo 子命令,用于准备确定/验证crate的MSRV

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 插件

Download history 302/week @ 2024-04-14 112/week @ 2024-04-21 149/week @ 2024-04-28 159/week @ 2024-05-05 138/week @ 2024-05-12 161/week @ 2024-05-19 63/week @ 2024-05-26 126/week @ 2024-06-02 212/week @ 2024-06-09 108/week @ 2024-06-16 114/week @ 2024-06-23 118/week @ 2024-06-30 87/week @ 2024-07-07 52/week @ 2024-07-14 619/week @ 2024-07-21 352/week @ 2024-07-28

每月1,117次下载

MIT 许可证

53KB
1K SLoC

cargo-msrv-prep

CI codecov Security audit crates.io downloads docs.rs Contributor Covenant

cargo-msrv-prep 是一个Cargo子命令,用于准备确定/验证Rust crate的MSRV(最小支持的Rust版本)。

安装

通过 cargo

cargo install cargo-msrv-prep --locked

通过 cargo-binstall

cargo binstall cargo-msrv-prep

您也可以通过从项目的发布页面下载适当的可执行文件来手动安装。

依赖项

这个工具旨在作为以下工具的伴侣(它们要酷得多)

如果您还没有安装这些工具,可以访问它们的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