为Cargo项目指定所需的rustc版本

23

是否可以指定一个Cargo项目需要最低的Rustc版本,例如1.1.0来进行编译?

6个回答

17

在 Rust 1.56.0 版本中,你可以使用 rust-version

rust-version 是一个可选的字段,用于告诉 Cargo 可以使用哪个版本的 Rust 语言和编译器来编译你的包。如果当前选择的 Rust 编译器版本比已声明的版本旧,则 Cargo 将以错误的形式退出,并告诉用户需要的版本。

[package]
rust-version = "1.56"

这是 Rust 未来版本的最佳选择。如果您需要在 Rustc 1.56.0 之前强制执行依赖项,则仍需使用 rustc_version crate。 - telotortium
附带问题:如果Crate A依赖于Crate B,而Crate B不能在较旧版本的Rustc上构建,那么将此添加到Crate B是否有助于Cargo在使用较旧版本的Rustc构建Crate A时选择正确的Crate B版本? - Cecile
1
@Cecile Cargo不会选择rustc版本,但可以通过某些选项或rustup进行覆盖,但这并不会自动发生。如果crate B需要更高的rustc版本,则在编译依赖项时应该会收到错误消息,指示您的rustc版本不是最新的。然后只需执行rustup upgrade即可。 - Stargateur
不选择 rustc 版本!选择 可以与正在使用的 rustc 版本编译的 crate B 的最新版本。也许如果我只分享 PR 的链接会更容易,很难解释 https://github.com/rust-disk-partition-management/gptman/pull/113 - Cecile
没关系,阅读rust-version文档后就清楚了,rust-version的唯一目的是退出并报错,而不是提供可用于编译crate的版本指示器。无论如何还是谢谢! - Cecile

10
你可以使用类似这样的 构建脚本
extern crate rustc_version;

use std::io::{self, Write};
use std::process::exit;       
use rustc_version::version_matches;   

fn main() {
    if !version_matches(">= 1.1.0") {
        writeln!(&mut io::stderr(), "This crate requires rustc >= 1.1.0.").unwrap();
        exit(1);
    }   
}

这使用了 rustc_version 的包。


rustc_version 0.2 uses if version().unwrap() >= Version::parse("1.4.0").unwrap() { println!("cargo:rustc-cfg=compiler_has_important_bugfix"); } - wegry

8

如果您的项目要求最低的 rustc 版本为 1.1.0 才能编译,您可以在与 Cargo.toml 文件相同的目录下创建一个名为 rust-toolchain(不带任何文件扩展名)的文件,并将以下内容添加到其中:

[toolchain]
channel = "1.1.0"
components = ["rust-src"]

当你运行 cargo build 时,它会自动下载和安装对应版本,并切换至该版本。详情请参阅Rust博客文章

这个Rust RFC #2495 提出了一种未来的替代方案,在那种情况下,我们只需要在Cargo.toml文件中添加一行rust = "1.1.0"即可。


为什么还需要另一个文件?这看起来像是有数百个方法的Python代码,RFC应该早就被实现完成了。 - Stargateur
这可以被二进制文件使用,但对于库来说,它仍然无法强制执行版本约束 - 这仍然需要 rustc_version。 - telotortium

4

我在 Github 上找到了一些旧的提议:

https://github.com/rust-lang/cargo/issues/837
https://github.com/rust-lang/cargo/issues/1044
https://github.com/rust-lang/cargo/issues/1214

他们已经关闭了

我认为目前这张票据没有太多可以采取的措施,我同意我们肯定会在 1.0 版发布后重新评估,但目前我认为货物不会进入支持各种 Rust 版本的业务,因为目前跟踪起来太不稳定了。

所以目前似乎还没有办法。也许你应该在那里提出你的问题。


2
RFC 2495已被批准用于指定最低Rust版本,但截至2021年3月,它仍未得到实施。 - Austin

1

不行。

目前唯一现实可行的方法是在文档和/或箱子的README中注明所需版本。

您可能能够配置multirust以使用正确的编译器,但请记住它仅适用于类UNIX环境。


-1
如果您使用Travis,可以配置支持哪些版本的Rust以及哪些通道。这是一种常见的文档方式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接