附录 G - Rust 的构建方式和 “Nightly Rust”
本附录介绍 Rust 是如何构建的,以及这对作为 Rust 开发者的您有何影响。
稳定而不停滞
作为一门语言,Rust 非常重视代码的稳定性。我们希望 Rust 成为您可以构建于其上的坚如磐石的基础,如果事物 постоянно 变化,那将是不可能的。与此同时,如果我们不能尝试新功能,我们可能无法在发布后才发现重要的缺陷,那时我们就无法再更改任何东西了。
我们解决这个问题的方法是我们称之为“稳定而不停滞”的策略,我们的指导原则是:您永远不必害怕升级到新的稳定 Rust 版本。每次升级都应该是轻松的,但也应该为您带来新功能、更少的错误和更快的编译时间。
呜呜!发布渠道和搭乘列车
Rust 开发以列车时刻表运作。也就是说,所有开发都在 Rust 仓库的 master
分支上完成。发布遵循软件发布列车模型,Cisco IOS 和其他软件项目也使用过这种模型。Rust 有三个发布渠道
- Nightly
- Beta
- 稳定版
大多数 Rust 开发者主要使用稳定渠道,但那些想要尝试实验性新功能的人可以使用 nightly 或 beta。
这是一个开发和发布过程如何运作的示例:假设 Rust 团队正在开发 Rust 1.5 的发布。该版本于 2015 年 12 月发布,但它将为我们提供实际的版本号。一个新功能被添加到 Rust 中:一个新的提交被提交到 master
分支。每天晚上,都会生成一个新的 nightly 版本的 Rust。每天都是发布日,这些发布由我们的发布基础设施自动创建。所以随着时间的推移,我们的发布看起来像这样,每晚一次
nightly: * - - * - - *
每六周,就到了准备新版本的时候了!Rust 仓库的 beta
分支从 nightly 使用的 master
分支分叉出来。现在,有两个发布版本
nightly: * - - * - - *
|
beta: *
大多数 Rust 用户不会积极使用 beta 版本,而是在他们的 CI 系统中针对 beta 版本进行测试,以帮助 Rust 发现可能的回退。与此同时,仍然每天晚上都有 nightly 版本发布
nightly: * - - * - - * - - * - - *
|
beta: *
假设发现了一个回退。幸好我们有时间在回退潜入稳定版本之前测试 beta 版本!修复程序被应用到 master
,以便 nightly 版本得到修复,然后修复程序被反向移植到 beta
分支,并生成一个新的 beta 版本
nightly: * - - * - - * - - * - - * - - *
|
beta: * - - - - - - - - *
在第一个 beta 版本创建六周后,就到了发布稳定版本的时候了!stable
分支从 beta
分支创建
nightly: * - - * - - * - - * - - * - - * - * - *
|
beta: * - - - - - - - - *
|
stable: *
万岁!Rust 1.5 完成了!但是,我们忘记了一件事:由于六周已经过去了,我们还需要下一个版本的 Rust,1.6 的新 beta 版本。因此,在 stable
从 beta
分支分叉出来后,下一个版本的 beta
再次从 nightly
分叉出来
nightly: * - - * - - * - - * - - * - - * - * - *
| |
beta: * - - - - - - - - * *
|
stable: *
这被称为“列车模型”,因为每六周,一个版本“离开车站”,但仍然必须经过 beta 渠道才能作为稳定版本到达。
Rust 每六周发布一个版本,就像时钟一样。如果您知道一个 Rust 版本的日期,您就可以知道下一个版本的日期:它在六周后。每六周安排一次发布的一个好处是,下一趟列车很快就要来了。如果某个功能恰好错过了某个特定版本,则无需担心:另一个版本很快就会发布!这有助于减少在发布截止日期临近时偷偷加入可能未完善的功能的压力。
благодаря этому процессу, вы всегда можете проверить следующую сборку Rust и убедиться сами, что обновление до нее легко: если бета-версия не работает должным образом, вы можете сообщить об этом команде и исправить это до выхода следующего стабильного релиза! Поломки в бета-релизе относительно редки, но rustc
по-прежнему является частью программного обеспечения, и ошибки все же случаются.
维护时间
Rust 项目支持最新的稳定版本。当新的稳定版本发布时,旧版本将达到其生命周期结束 (EOL)。这意味着每个版本都支持六周。
不稳定功能
这种发布模型还有一个问题:不稳定功能。Rust 使用一种称为“功能标志”的技术来确定在给定版本中启用了哪些功能。如果一个新功能正在积极开发中,它会提交到 master
,因此也会提交到 nightly 版本中,但在一个功能标志之后。如果您作为用户希望尝试正在进行中的功能,您可以,但您必须使用 nightly 版本的 Rust,并使用适当的标志注释您的源代码以选择加入。
如果您使用的是 beta 或稳定版本的 Rust,则不能使用任何功能标志。这是使我们能够在声明新功能永远稳定之前实际使用新功能的关键。那些希望选择加入前沿功能的人可以这样做,而那些想要获得坚如磐石的体验的人可以坚持使用稳定版本,并且知道他们的代码不会崩溃。稳定而不停滞。
本书仅包含有关稳定功能的信息,因为正在进行中的功能仍在更改,并且肯定在本书编写时和它们在稳定版本中启用时会有所不同。您可以在网上找到仅限 nightly 版本的功能的文档。
Rustup 和 Rust Nightly 的作用
Rustup 使您可以轻松地在 Rust 的不同发布渠道之间切换,无论是在全局还是在项目级别。默认情况下,您将安装稳定版本的 Rust。例如,要安装 nightly 版本
$ rustup toolchain install nightly
您还可以使用 rustup
查看您已安装的所有工具链(Rust 和相关组件的版本)。这是一个在您的作者之一的 Windows 计算机上的示例
> rustup toolchain list
stable-x86_64-pc-windows-msvc (default)
beta-x86_64-pc-windows-msvc
nightly-x86_64-pc-windows-msvc
如您所见,稳定工具链是默认的。大多数 Rust 用户在大多数时候都使用稳定版本。您可能希望在大多数时候使用稳定版本,但在特定项目中使用 nightly 版本,因为您关心前沿功能。为此,您可以在该项目的目录中使用 rustup override
将 nightly 工具链设置为 rustup
在您位于该目录时应使用的工具链
$ cd ~/projects/needs-nightly
$ rustup override set nightly
现在,每次您在 ~/projects/needs-nightly 中调用 rustc
或 cargo
时,rustup
都会确保您使用的是 nightly 版本的 Rust,而不是您的默认稳定版本 Rust。当您有很多 Rust 项目时,这会非常方便!
RFC 流程和团队
那么您如何了解这些新功能呢?Rust 的开发模型遵循意见征求稿 (RFC) 流程。如果您想要改进 Rust,您可以撰写一份提案,称为 RFC。
任何人都可以编写 RFC 来改进 Rust,提案由 Rust 团队审查和讨论,Rust 团队由许多主题子团队组成。Rust 网站上列出了所有团队,其中包括项目每个领域的团队:语言设计、编译器实现、基础设施、文档等等。相应的团队阅读提案和评论,写一些他们自己的评论,最终达成共识以接受或拒绝该功能。
如果该功能被接受,则会在 Rust 仓库上打开一个 issue,然后有人可以实现它。实现它的人很可能不是最初提出该功能的人!当实现准备就绪时,它会提交到 master
分支,并在功能门后,正如我们在“不稳定功能”章节中讨论的那样。
过一段时间后,一旦使用 nightly 版本的 Rust 开发者能够尝试新功能,团队成员将讨论该功能,它在 nightly 版本上的运行情况,并决定是否应将其纳入稳定版本的 Rust。如果决定继续推进,则会移除功能门,并且该功能现在被认为是稳定的!它搭乘列车进入新的稳定 Rust 版本。