发布 Rust 1.49.0

2020 年 12 月 31 日 · Rust 发布团队

Rust 团队很高兴地宣布 Rust 1.49.0 新版本发布了。Rust 是一门赋能每个人构建可靠且高效软件的编程语言。

如果您之前已经通过 rustup 安装了 Rust,那么获取 Rust 1.49.0 非常简单,只需运行

$ rustup update stable

如果您还没有安装,可以从我们网站上的相应页面获取 rustup,并在 GitHub 上查看 1.49.0 的详细发布说明

1.49.0 稳定版包含什么

在此版本中,我们添加了一些新目标平台并改进了测试框架。查看详细发布说明以了解本文未涵盖的其他变更。

64 位 ARM Linux 达到 Tier 1 级别

Rust 编译器支持多种多样的目标平台,但 Rust 团队无法为所有这些平台提供相同级别的支持。为了明确标记每个目标平台的受支持程度,我们使用了分级系统

  • Tier 3 级别目标平台在技术上受编译器支持,但我们不检查其代码是否构建成功或通过测试,并且我们不提供任何预编译的二进制文件作为我们发布的一部分。
  • Tier 2 级别目标平台保证可以构建,并且我们提供预编译的二进制文件,但我们不在这些平台上执行测试套件:生成的二进制文件可能无法工作或可能存在 bug。
  • Tier 1 级别目标平台提供最高的保证支持,对于编译器中合并的每一个变更,我们都会在这些平台上运行完整的测试套件。同时提供预编译的二进制文件。

Rust 1.49.0 将 aarch64-unknown-linux-gnu 目标平台提升至 Tier 1 支持级别,为运行 Linux 的 64 位 ARM 系统用户带来最高级别的保证!我们预计这一变更将使从嵌入式到桌面和服务器的各种工作负载受益。

这是该项目的一个重要里程碑,因为这是非 x86 目标平台首次达到 Tier 1 支持级别:我们希望这将为更多目标平台在未来达到我们的最高级别铺平道路。

请注意,Android 不受此变更影响,因为它使用不同的 Tier 2 目标平台。

64 位 ARM macOS 和 Windows 达到 Tier 2 级别

Rust 1.49.0 还包含两个达到 Tier 2 支持级别的目标平台

  • aarch64-apple-darwin 目标平台为 Rust 在 Apple M1 系统上提供了支持。
  • aarch64-pc-windows-msvc 目标平台为 Rust 在运行 Windows on ARM 的 64 位 ARM 设备上提供了支持。

开发者可以期望从现在起可以使用 rustup 安装这两个目标平台的预编译二进制文件!不过,Rust 团队不在这些平台上运行测试套件,因此可能存在 bug 或不稳定情况。

测试框架捕获线程中的输出

Rust 内置的测试框架没有大量的特性,但这并不意味着它不能改进!考虑一个像这样的测试

#[test]
fn thready_pass() {
    println!("fee");
    std::thread::spawn(|| {
        println!("fie");
        println!("foe");
    })
    .join()
    .unwrap();
    println!("fum");
}

以下是 Rust 1.49.0 之前运行此测试的样子

❯ cargo +1.48.0 test
   Compiling threadtest v0.1.0 (C:\threadtest)
    Finished test [unoptimized + debuginfo] target(s) in 0.38s
     Running target\debug\deps\threadtest-02f42ffd9836cae5.exe

running 1 test
fie
foe
test thready_pass ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

   Doc-tests threadtest

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

你可以看到线程的输出被打印出来,它与测试框架本身的输出混杂在一起。如果每个 println! 都像打印“fum”那个一样工作,那岂不是很好吗?这就是 Rust 1.49.0 中的行为

❯ cargo test
   Compiling threadtest v0.1.0 (C:\threadtest)
    Finished test [unoptimized + debuginfo] target(s) in 0.52s
     Running target\debug\deps\threadtest-40aabfaa345584be.exe

running 1 test
test thready_pass ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

   Doc-tests threadtest

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

但别担心;如果测试失败,你仍然会看到所有的输出。通过在测试末尾添加一个 panic!,我们可以看到失败的样子

❯ cargo test
   Compiling threadtest v0.1.0 (C:\threadtest)
    Finished test [unoptimized + debuginfo] target(s) in 0.52s
     Running target\debug\deps\threadtest-40aabfaa345584be.exe

running 1 test
test thready_pass ... FAILED

failures:

---- thready_pass stdout ----
fee
fie
foe
fum
thread 'thready_pass' panicked at 'explicit panic', src\lib.rs:11:5

具体来说,测试运行器会确保捕获输出,并在测试失败时将其保存下来。

库变更

在 Rust 1.49.0 中,有三个新的稳定函数

并且有两个函数被标记为 const

查看详细发布说明以了解其他变更。

其他变更

Rust 1.49.0 版本中还有其他变更:查看 RustCargoClippy 中的变化。

1.49.0 贡献者

许多人共同努力创建了 Rust 1.49.0。没有你们,我们不可能做到这一切。感谢!