Phụ lục G - Cách Rust Được Tạo Ra và "Rust Nightly"
Phụ lục này nói về cách Rust được tạo ra và điều đó ảnh hưởng như thế nào đến bạn với tư cách là một nhà phát triển Rust.
Sự Ổn Định Không Đình Trệ
Là một ngôn ngữ, Rust quan tâm rất nhiều về tính ổn định của mã của bạn. Chúng tôi muốn Rust trở thành nền tảng vững chắc mà bạn có thể xây dựng trên đó, và nếu mọi thứ liên tục thay đổi, điều đó sẽ là không thể. Đồng thời, nếu chúng ta không thể thử nghiệm với các tính năng mới, chúng ta có thể không phát hiện ra những lỗi quan trọng cho đến sau khi phát hành, khi chúng ta không thể thay đổi mọi thứ nữa.
Giải pháp của chúng tôi cho vấn đề này là điều chúng tôi gọi là "sự ổn định không đình trệ", và nguyên tắc hướng dẫn của chúng tôi là: bạn không bao giờ phải lo sợ việc nâng cấp lên phiên bản mới của Rust ổn định. Mỗi lần nâng cấp nên diễn ra suôn sẻ, nhưng cũng nên mang đến cho bạn các tính năng mới, ít lỗi hơn và thời gian biên dịch nhanh hơn.
Choo, Choo! Các Kênh Phát Hành và Đi Theo Các Đoàn Tàu
Sự phát triển của Rust hoạt động theo một lịch trình đoàn tàu. Nghĩa là, tất
cả sự phát triển được thực hiện trên nhánh master
của kho lưu trữ Rust. Các
phiên bản phát hành tuân theo mô hình đoàn tàu phát hành phần mềm, đã được sử
dụng bởi Cisco IOS và các dự án phần mềm khác. Có ba kênh phát hành cho Rust:
- Nightly
- Beta
- Stable
Hầu hết các nhà phát triển Rust chủ yếu sử dụng kênh ổn định, nhưng những người muốn thử các tính năng mới có thể sử dụng nightly hoặc beta.
Dưới đây là một ví dụ về cách quá trình phát triển và phát hành hoạt động: giả
sử rằng nhóm Rust đang làm việc trên phiên bản Rust 1.5. Phiên bản đó đã được
phát hành vào tháng 12 năm 2015, nhưng nó sẽ cung cấp cho chúng ta các số phiên
bản thực tế. Một tính năng mới được thêm vào Rust: một commit mới được đưa vào
nhánh master
. Mỗi đêm, một phiên bản nightly mới của Rust được tạo ra. Mỗi
ngày là một ngày phát hành, và các phiên bản này được tạo ra bởi cơ sở hạ tầng
phát hành của chúng tôi một cách tự động. Vì vậy, theo thời gian, các phiên bản
của chúng tôi trông như thế này, mỗi đêm một lần:
nightly: * - - * - - *
Cứ mỗi sáu tuần, đã đến lúc chuẩn bị một phiên bản mới! Nhánh beta
của kho lưu
trữ Rust tách ra từ nhánh master
được sử dụng bởi nightly. Bây giờ, có hai
phiên bản:
nightly: * - - * - - *
|
beta: *
Hầu hết người dùng Rust không sử dụng các phiên bản beta một cách tích cực, nhưng kiểm tra chống lại beta trong hệ thống CI của họ để giúp Rust phát hiện các lỗi có thể xảy ra. Trong khi đó, vẫn có một phiên bản nightly mỗi đêm:
nightly: * - - * - - * - - * - - *
|
beta: *
Giả sử một lỗi được phát hiện. Thật may mắn là chúng tôi đã có thời gian để kiểm
tra phiên bản beta trước khi lỗi này lẻn vào phiên bản ổn định! Bản sửa lỗi được
áp dụng cho master
, để nightly được sửa, và sau đó bản sửa lỗi được chuyển lại
cho nhánh beta
, và một phiên bản beta mới được tạo ra:
nightly: * - - * - - * - - * - - * - - *
|
beta: * - - - - - - - - *
Sáu tuần sau khi phiên bản beta đầu tiên được tạo ra, đã đến lúc phát hành phiên
bản ổn định! Nhánh stable
được tạo ra từ nhánh beta
:
nightly: * - - * - - * - - * - - * - - * - * - *
|
beta: * - - - - - - - - *
|
stable: *
Hoan hô! Rust 1.5 đã hoàn thành! Tuy nhiên, chúng tôi đã quên một điều: vì sáu
tuần đã trôi qua, chúng tôi cũng cần một phiên bản beta mới của phiên bản tiếp
theo của Rust, 1.6. Vì vậy, sau khi stable
tách ra từ beta
, phiên bản tiếp
theo của beta
lại tách ra từ nightly
:
nightly: * - - * - - * - - * - - * - - * - * - *
| |
beta: * - - - - - - - - * *
|
stable: *
Điều này được gọi là "mô hình đoàn tàu" vì cứ mỗi sáu tuần, một phiên bản "rời khỏi nhà ga", nhưng vẫn phải trải qua một hành trình qua kênh beta trước khi nó đến như một phiên bản ổn định.
Rust phát hành mỗi sáu tuần, như đồng hồ. Nếu bạn biết ngày của một phiên bản Rust, bạn có thể biết ngày của phiên bản tiếp theo: nó là sáu tuần sau đó. Một khía cạnh hay của việc có các phiên bản được lên lịch mỗi sáu tuần là đoàn tàu tiếp theo đang đến sớm. Nếu một tính năng tình cờ bỏ lỡ một phiên bản cụ thể, không cần phải lo lắng: một phiên bản khác đang diễn ra trong thời gian ngắn! Điều này giúp giảm áp lực để lén lút các tính năng có thể chưa hoàn thiện vào gần thời hạn phát hành.
Nhờ quá trình này, bạn luôn có thể kiểm tra bản dựng tiếp theo của Rust và tự
mình xác minh rằng việc nâng cấp là dễ dàng: nếu một phiên bản beta không hoạt
động như mong đợi, bạn có thể báo cáo cho nhóm và sửa lỗi trước khi phiên bản ổn
định tiếp theo diễn ra! Sự cố trong một phiên bản beta là tương đối hiếm, nhưng
rustc
vẫn là một phần mềm, và lỗi vẫn tồn tại.
Thời gian bảo trì
Dự án Rust hỗ trợ phiên bản ổn định mới nhất. Khi một phiên bản ổn định mới được phát hành, phiên bản cũ sẽ đạt đến cuối vòng đời (EOL). Điều này có nghĩa là mỗi phiên bản được hỗ trợ trong sáu tuần.
Các Tính Năng Không Ổn Định
Có một điều nữa với mô hình phát hành này: các tính năng không ổn định. Rust sử
dụng một kỹ thuật gọi là "cờ tính năng" để xác định các tính năng nào được kích
hoạt trong một phiên bản nhất định. Nếu một tính năng mới đang được phát triển
tích cực, nó sẽ được đưa vào master
, và do đó, trong nightly, nhưng đằng sau
một cờ tính năng. Nếu bạn, với tư cách là người dùng, muốn thử tính năng đang
trong quá trình phát triển, bạn có thể, nhưng bạn phải sử dụng phiên bản nightly
của Rust và chú thích mã nguồn của bạn với cờ thích hợp để chọn tham gia.
Nếu bạn đang sử dụng phiên bản beta hoặc ổn định của Rust, bạn không thể sử dụng bất kỳ cờ tính năng nào. Đây là chìa khóa cho phép chúng tôi sử dụng thực tế với các tính năng mới trước khi chúng tôi tuyên bố chúng ổn định mãi mãi. Những người muốn tham gia vào cạnh tiên tiến có thể làm như vậy, và những người muốn có trải nghiệm vững chắc có thể gắn bó với ổn định và biết rằng mã của họ sẽ không bị hỏng. Sự ổn định không đình trệ.
Cuốn sách này chỉ chứa thông tin về các tính năng ổn định, vì các tính năng đang trong quá trình phát triển vẫn đang thay đổi, và chắc chắn chúng sẽ khác nhau giữa khi cuốn sách này được viết và khi chúng được kích hoạt trong các bản dựng ổn định. Bạn có thể tìm thấy tài liệu cho các tính năng chỉ có trong nightly trực tuyến.
Rustup và Vai Trò của Rust Nightly
Rustup giúp dễ dàng chuyển đổi giữa các kênh phát hành khác nhau của Rust, trên toàn cầu hoặc theo dự án. Theo mặc định, bạn sẽ có Rust ổn định được cài đặt. Để cài đặt nightly, ví dụ:
$ rustup toolchain install nightly
Bạn cũng có thể xem tất cả các toolchains (các phiên bản của Rust và các thành
phần liên quan) mà bạn đã cài đặt với rustup
. Dưới đây là một ví dụ trên máy
tính Windows của một trong những tác giả của bạn:
> rustup toolchain list
stable-x86_64-pc-windows-msvc (default)
beta-x86_64-pc-windows-msvc
nightly-x86_64-pc-windows-msvc
Như bạn có thể thấy, toolchain ổn định là mặc định. Hầu hết người dùng Rust sử
dụng ổn định hầu hết thời gian. Bạn có thể muốn sử dụng ổn định hầu hết thời
gian, nhưng sử dụng nightly trên một dự án cụ thể, vì bạn quan tâm đến một tính
năng tiên tiến. Để làm điều đó, bạn có thể sử dụng rustup override
trong thư
mục của dự án đó để đặt toolchain nightly là toolchain mà rustup
nên sử dụng
khi bạn ở trong thư mục đó:
$ cd ~/projects/needs-nightly
$ rustup override set nightly
Bây giờ, mỗi khi bạn gọi rustc
hoặc cargo
bên trong
~/projects/needs-nightly, rustup
sẽ đảm bảo rằng bạn đang sử dụng Rust
nightly, thay vì mặc định của bạn là Rust ổn định. Điều này rất hữu ích khi bạn
có nhiều dự án Rust!
Quy Trình RFC và Các Nhóm
Vậy làm thế nào để bạn biết về những tính năng mới này? Mô hình phát triển của Rust tuân theo một Quy Trình Yêu Cầu Bình Luận (RFC). Nếu bạn muốn cải thiện Rust, bạn có thể viết một đề xuất, gọi là RFC.
Bất kỳ ai cũng có thể viết RFC để cải thiện Rust, và các đề xuất được xem xét và thảo luận bởi nhóm Rust, bao gồm nhiều nhóm chủ đề. Có một danh sách đầy đủ các nhóm trên trang web của Rust, bao gồm các nhóm cho mỗi lĩnh vực của dự án: thiết kế ngôn ngữ, triển khai trình biên dịch, cơ sở hạ tầng, tài liệu và nhiều hơn nữa. Nhóm thích hợp đọc đề xuất và các bình luận, viết một số bình luận của riêng họ, và cuối cùng, có sự đồng thuận để chấp nhận hoặc từ chối tính năng.
Nếu tính năng được chấp nhận, một vấn đề được mở trên kho lưu trữ Rust, và ai đó
có thể triển khai nó. Người triển khai nó rất có thể không phải là người đề xuất
tính năng ban đầu! Khi việc triển khai đã sẵn sàng, nó sẽ được đưa vào nhánh
master
đằng sau một cờ tính năng, như chúng tôi đã thảo luận trong phần
“Các Tính Năng Không Ổn Định”.
Sau một thời gian, khi các nhà phát triển Rust sử dụng các phiên bản nightly đã có thể thử tính năng mới, các thành viên nhóm sẽ thảo luận về tính năng, cách nó hoạt động trên nightly, và quyết định xem nó có nên được đưa vào Rust ổn định hay không. Nếu quyết định là tiến lên, cờ tính năng sẽ được gỡ bỏ, và tính năng này bây giờ được coi là ổn định! Nó sẽ đi theo các đoàn tàu vào một phiên bản ổn định mới của Rust.