Rust 附錄 G:Rust 是如何開發(fā)的與 “Nightly Rust”

2023-03-22 15:17 更新
appendix-07-nightly-rust.md
commit d44317c3122b44fb713aba66cc295dee3453b24b

本附錄介紹 Rust 是如何開發(fā)的以及這如何影響作為 Rust 開發(fā)者的你。

無停滯穩(wěn)定

作為一個(gè)語言,Rust 十分 注重代碼的穩(wěn)定性。我們希望 Rust 成為你代碼堅(jiān)實(shí)的基礎(chǔ),假如持續(xù)地有東西在變,這個(gè)希望就實(shí)現(xiàn)不了。但與此同時(shí),如果不能實(shí)驗(yàn)新功能的話,在發(fā)布之前我們又無法發(fā)現(xiàn)其中重大的缺陷,而一旦發(fā)布便再也沒有修改的機(jī)會(huì)了。

對(duì)于這個(gè)問題我們的解決方案被稱為 “無停滯穩(wěn)定”(“stability without stagnation”),其指導(dǎo)性原則是:無需擔(dān)心升級(jí)到最新的穩(wěn)定版 Rust。每次升級(jí)應(yīng)該是無痛的,并應(yīng)帶來新功能,更少的 bug 和更快的編譯速度。

Choo, Choo! (開車?yán)玻樱?nbsp;發(fā)布通道和發(fā)布時(shí)刻表(Riding the Trains)

Rust 開發(fā)運(yùn)行于一個(gè) 車次表 發(fā)布時(shí)刻表train schedule)之上。也就是說,所有的開發(fā)工作都位于 Rust 倉庫的 master 分支。發(fā)布采用 software release train 模型,其被用于思科 IOS 等其它軟件項(xiàng)目。Rust 有三個(gè) 發(fā)布通道release channel):

  • Nightly
  • Beta
  • Stable(穩(wěn)定版)

大部分 Rust 開發(fā)者主要采用穩(wěn)定版通道,不過希望實(shí)驗(yàn)新功能的開發(fā)者可能會(huì)使用 nightly 或 beta 版。

如下是一個(gè)開發(fā)和發(fā)布過程如何運(yùn)轉(zhuǎn)的例子:假設(shè) Rust 團(tuán)隊(duì)正在進(jìn)行 Rust 1.5 的發(fā)布工作。該版本發(fā)布于 2015 年 12 月,不過這里只是為了提供一個(gè)真實(shí)的版本。Rust 新增了一項(xiàng)功能:一個(gè) master 分支的新提交。每天晚上,會(huì)產(chǎn)生一個(gè)新的 nightly 版本。每天都是發(fā)布版本的日子,而這些發(fā)布由發(fā)布基礎(chǔ)設(shè)施自動(dòng)完成。所以隨著時(shí)間推移,發(fā)布軌跡看起來像這樣,版本一天一發(fā):

nightly: * - - * - - *

每 6 周時(shí)間,是準(zhǔn)備發(fā)布新版本的時(shí)候了!Rust 倉庫的 beta 分支會(huì)從用于 nightly 的 master 分支產(chǎn)生?,F(xiàn)在,有了兩個(gè)發(fā)布版本:

nightly: * - - * - - *
                     |
beta:                *

大部分 Rust 用戶不會(huì)主要使用 beta 版本,不過在 CI 系統(tǒng)中對(duì) beta 版本進(jìn)行測(cè)試能夠幫助 Rust 發(fā)現(xiàn)可能的回歸缺陷(regression)。同時(shí),每天仍產(chǎn)生 nightly 發(fā)布:

nightly: * - - * - - * - - * - - *
                     |
beta:                *

比如我們發(fā)現(xiàn)了一個(gè)回歸缺陷。好消息是在這些缺陷流入穩(wěn)定發(fā)布之前還有一些時(shí)間來測(cè)試 beta 版本!fix 被合并到 master,為此 nightly 版本得到了修復(fù),接著這些 fix 將 backport 到 beta 分支,一個(gè)新的 beta 發(fā)布就產(chǎn)生了:

nightly: * - - * - - * - - * - - * - - *
                     |
beta:                * - - - - - - - - *

第一個(gè) beta 版的 6 周后,是發(fā)布穩(wěn)定版的時(shí)候了!stable 分支從 beta 分支生成:

nightly: * - - * - - * - - * - - * - - * - * - *
                     |
beta:                * - - - - - - - - *
                                       |
stable:                                *

好的!Rust 1.5 發(fā)布了!然而,我們忘了些東西:因?yàn)橛诌^了 6 周,我們還需發(fā)布 新版 Rust 的 beta 版,Rust 1.6。所以從 beta 生成 stable 分支后,新版的 beta 分支也再次從 nightly 生成:

nightly: * - - * - - * - - * - - * - - * - * - *
                     |                         |
beta:                * - - - - - - - - *       *
                                       |
stable:                                *

這被稱為 “train model”,因?yàn)槊?6 周,一個(gè)版本 “離開車站”(“l(fā)eaves the station”),不過從 beta 通道到達(dá)穩(wěn)定通道還有一段旅程。

Rust 每 6 周發(fā)布一個(gè)版本,如時(shí)鐘般準(zhǔn)確。如果你知道了某個(gè) Rust 版本的發(fā)布時(shí)間,就可以知道下個(gè)版本的時(shí)間:6 周后。每 6 周發(fā)布版本的一個(gè)好的方面是下一班車會(huì)來得更快。如果特定版本碰巧缺失某個(gè)功能也無需擔(dān)心:另一個(gè)版本很快就會(huì)到來!這有助于減少因臨近發(fā)版時(shí)間而偷偷釋出未經(jīng)完善的功能的壓力。

多虧了這個(gè)過程,你總是可以切換到下一版本的 Rust 并驗(yàn)證是否可以輕易的升級(jí):如果 beta 版不能如期工作,你可以向 Rust 團(tuán)隊(duì)報(bào)告并在發(fā)布穩(wěn)定版之前得到修復(fù)!beta 版造成的破壞是非常少見的,不過 rustc 也不過是一個(gè)軟件,可能會(huì)存在 bug。

不穩(wěn)定功能

這個(gè)發(fā)布模型中另一個(gè)值得注意的地方:不穩(wěn)定功能(unstable features)。Rust 使用一個(gè)被稱為 “功能標(biāo)記”(“feature flags”)的技術(shù)來確定給定版本的某個(gè)功能是否啟用。如果新功能正在積極地開發(fā)中,其提交到了 master,因此會(huì)出現(xiàn)在 nightly 版中,不過會(huì)位于一個(gè) 功能標(biāo)記 之后。作為用戶,如果你希望嘗試這個(gè)正在開發(fā)的功能,則可以在源碼中使用合適的標(biāo)記來開啟,不過必須使用 nightly 版。

如果使用的是 beta 或穩(wěn)定版 Rust,則不能使用任何功能標(biāo)記。這是在新功能被宣布為永久穩(wěn)定之前獲得實(shí)用價(jià)值的關(guān)鍵。這既滿足了希望使用最尖端技術(shù)的同學(xué),那些堅(jiān)持穩(wěn)定版的同學(xué)也知道其代碼不會(huì)被破壞。這就是無停滯穩(wěn)定。

本書只包含穩(wěn)定的功能,因?yàn)檫€在開發(fā)中的功能仍可能改變,當(dāng)其進(jìn)入穩(wěn)定版時(shí)肯定會(huì)與編寫本書的時(shí)候有所不同。你可以在網(wǎng)上獲取 nightly 版的文檔。

Rustup 和 Rust Nightly 的職責(zé)

Rustup 使得改變不同發(fā)布通道的 Rust 更為簡(jiǎn)單,其在全局或分項(xiàng)目的層次工作。其默認(rèn)會(huì)安裝穩(wěn)定版 Rust。例如為了安裝 nightly:

$ rustup toolchain install nightly

你會(huì)發(fā)現(xiàn) rustup 也安裝了所有的 工具鏈toolchains, Rust 和其相關(guān)組件)。如下是一位作者的 Windows 計(jì)算機(jī)上的例子:

> rustup toolchain list
stable-x86_64-pc-windows-msvc (default)
beta-x86_64-pc-windows-msvc
nightly-x86_64-pc-windows-msvc

如你所見,默認(rèn)是穩(wěn)定版。大部分 Rust 用戶在大部分時(shí)間使用穩(wěn)定版。你可能也會(huì)這么做,不過如果你關(guān)心最新的功能,可以為特定項(xiàng)目使用 nightly 版。為此,可以在項(xiàng)目目錄使用 rustup override 來設(shè)置當(dāng)前目錄 rustup 使用 nightly 工具鏈:

$ cd ~/projects/needs-nightly
$ rustup override set nightly

現(xiàn)在,每次在 ~/projects/needs-nightly 調(diào)用 rustc 或 cargo,rustup 會(huì)確保使用 nightly 版 Rust。在你有很多 Rust 項(xiàng)目時(shí)大有裨益!

RFC 過程和團(tuán)隊(duì)

那么你如何了解這些新功能呢?Rust 開發(fā)模式遵循一個(gè) Request For Comments (RFC) 過程。如果你希望改進(jìn) Rust,可以編寫一個(gè)提議,也就是 RFC。

任何人都可以編寫 RFC 來改進(jìn) Rust,同時(shí)這些 RFC 會(huì)被 Rust 團(tuán)隊(duì)評(píng)審和討論,他們由很多不同分工的子團(tuán)隊(duì)組成。這里是 Rust 官網(wǎng)上 所有團(tuán)隊(duì)的總列表,其包含了項(xiàng)目中每個(gè)領(lǐng)域的團(tuán)隊(duì):語言設(shè)計(jì)、編譯器實(shí)現(xiàn)、基礎(chǔ)設(shè)施、文檔等。各個(gè)團(tuán)隊(duì)會(huì)閱讀相應(yīng)的提議和評(píng)論,編寫回復(fù),并最終達(dá)成接受或回絕功能的一致。

如果功能被接受了,在 Rust 倉庫會(huì)打開一個(gè) issue,人們就可以實(shí)現(xiàn)它。實(shí)現(xiàn)功能的人當(dāng)然可能不是最初提議功能的人!當(dāng)實(shí)現(xiàn)完成后,其會(huì)合并到 master 分支并位于一個(gè)功能開關(guān)(feature gate)之后,正如 “不穩(wěn)定功能” 部分所討論的。

在稍后的某個(gè)時(shí)間,一旦使用 nightly 版的 Rust 團(tuán)隊(duì)能夠嘗試這個(gè)功能了,團(tuán)隊(duì)成員會(huì)討論這個(gè)功能,它如何在 nightly 中工作,并決定是否應(yīng)該進(jìn)入穩(wěn)定版。如果決定繼續(xù)推進(jìn),功能開關(guān)會(huì)移除,然后這個(gè)功能就被認(rèn)為是穩(wěn)定的了!乘著“發(fā)布的列車”,最終在新的穩(wěn)定版 Rust 中出現(xiàn)。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)