将现有项目转换到新版本

Rust 包含可自动将项目从一个版本转换到下一个版本的工具。它将更新您的源代码,使其与下一个版本兼容。简而言之,更新到下一个版本的步骤是

  1. 运行 cargo fix --edition
  2. 编辑 Cargo.toml 并将 edition 字段设置为下一个版本,例如 edition = "2021"
  3. 运行 cargo buildcargo test 以验证修复是否有效。

以下部分将深入探讨这些步骤的细节,以及您在此过程中可能会遇到的一些问题。

我们的目标是使迁移到新版本的过程尽可能顺利。如果您难以升级到最新版本,我们认为这是一个错误。如果您在此过程中遇到问题,请提交错误报告。谢谢!

开始迁移

例如,让我们看一下从 2015 版本转换到 2018 版本的过程。转换到其他版本(如 2021)的步骤基本相同。

假设我们有一个 crate,其 src/lib.rs 中有以下代码

#![allow(unused)]
fn main() {
trait Foo {
    fn foo(&self, i32);
}
}

这段代码使用了一个匿名参数,即 i32。这在Rust 2018 中不受支持,因此这将无法编译。让我们更新这段代码!

更新您的代码以使其与新版本兼容

您的代码可能会也可能不会使用与新版本不兼容的功能。为了帮助您转换到下一个版本,Cargo 包含cargo fix 子命令,可以自动更新您的源代码。首先,让我们运行它

cargo fix --edition

这将检查您的代码,并自动修复它可以修复的任何问题。让我们再次查看 src/lib.rs

#![allow(unused)]
fn main() {
trait Foo {
    fn foo(&self, _: i32);
}
}

它重写了我们的代码,为 i32 值引入了一个参数名称。在这种情况下,由于它没有名称,cargo fix 会将其替换为 _,这是未使用变量的惯例。

cargo fix 并非总能自动修复您的代码。如果 cargo fix 无法修复某些内容,它将在控制台中打印无法修复的警告。如果您看到其中一个警告,则必须手动更新代码。有关迁移过程的更多信息,请参阅高级迁移策略章节,并阅读本指南中解释需要进行哪些更改的章节。如果您遇到问题,请在用户论坛寻求帮助。

启用新版本以使用新功能

为了使用一些新功能,您必须显式选择加入新版本。准备好继续后,请更改您的 Cargo.toml 以添加新的 edition 键/值对。例如

[package]
name = "foo"
version = "0.1.0"
edition = "2018"

如果没有 edition 键,Cargo 将默认为 Rust 2015。但在这种情况下,我们选择了 2018,因此我们的代码将使用 Rust 2018 进行编译!

下一步是在新版本上测试您的项目。运行您的项目测试以验证一切正常,例如运行 cargo test。如果发出新的警告,您可能需要考虑再次运行 cargo fix(不带 --edition 标志)以应用编译器提供的任何建议。

恭喜!您的代码现在在 Rust 2015 和 Rust 2018 中都有效!

迁移到不稳定版本

版本发布后,大约有三年时间才会发布下一个版本。在此期间,可能会向下一个版本添加新功能,这些功能仅在夜间频道上可用。如果您想在这些新功能稳定之前帮助测试它们,可以使用夜间频道进行尝试。

这些步骤与稳定频道大致相似

  1. 安装最新的夜间版本:rustup update nightly
  2. 运行 cargo +nightly fix --edition
  3. 编辑 Cargo.toml 并将 cargo-features = ["edition2024"] 放在顶部(在 [package] 之上),并将版本字段更改为 edition = "2024"
  4. 运行 cargo +nightly check 以验证它现在是否在新版本中有效。

⚠ 注意:在下一个版本中实现的功能可能没有使用 cargo fix 实现自动迁移,并且功能本身可能尚未完成。如果可能,本指南应包含有关哪些功能在夜间版本中实现的信息,以及有关其状态的更多信息。在版本稳定前的几个月,所有新功能都应完全实现,并且Rust 博客将宣布进行测试。