Приложение G — Как создаётся Rust и «Nightly Rust»
Это приложение рассказывает о том, как создаётся Rust и как это влияет на вас как на разработчика на Rust.
Стабильность без застоя
Как язык, Rust очень заботится о стабильности вашего кода. Мы хотим, чтобы Rust был надёжным фундаментом, на котором можно строить, и если бы всё постоянно менялось, это было бы невозможно. В то же время, если мы не можем экспериментировать с новыми возможностями, мы можем не обнаружить важные недостатки до их выпуска, когда уже ничего нельзя изменить.
Наше решение этой проблемы — то, что мы называем «стабильностью без застоя», и наш руководящий принцип таков: вы никогда не должны бояться обновления до новой версии стабильного Rust. Каждое обновление должно быть безболезненным, но также должно приносить новые возможности, меньше ошибок и более быстрое время компиляции.
Чух-чух! Каналы выпуска и поезда
Разработка Rust следует графику поездов. То есть вся разработка ведётся в ветке master репозитория Rust. Выпуски следуют модели поездов выпуска программного обеспечения, которая использовалась в Cisco IOS и других проектах. Существует три канала выпуска для Rust:
- Nightly
- Beta
- Stable
Большинство разработчиков Rust в основном используют стабильный канал, но те, кто хочет попробовать экспериментальные новые возможности, могут использовать nightly или beta.
Вот пример того, как работает процесс разработки и выпуска: предположим, что команда Rust работает над выпуском Rust 1.5. Этот выпуск состоялся в декабре 2015 года, но он даст нам реалистичные номера версий. Новая функциональность добавляется в Rust: новый коммит попадает в ветку master. Каждую ночь производится новая nightly-версия Rust. Каждый день — день выпуска, и эти выпуски создаются нашей инфраструктурой выпусков автоматически. Так что с течением времени наши выпуски выглядят так, раз в ночь:
nightly: * - - * - - *
Каждые шесть недель наступает время подготовить новый выпуск! Ветка beta репозитория Rust отделяется от ветки master, используемой nightly. Теперь есть два выпуска:
nightly: * - - * - - *
|
beta: *
Большинство пользователей Rust не используют beta-выпуски активно, но тестируют на beta в своей системе CI, чтобы помочь Rust обнаружить возможные регрессии. В это время nightly-выпуск всё ещё происходит каждую ночь:
nightly: * - - * - - * - - * - - *
|
beta: *
Предположим, регрессия обнаружена. Хорошо, что у нас было время протестировать beta-выпуск, прежде чем регрессия проникла в стабильный выпуск! Исправление применяется к master, так что nightly исправлен, а затем исправление переносится в ветку beta, и производится новый beta-выпуск:
nightly: * - - * - - * - - * - - * - - *
|
beta: * - - - - - - - - *
Через шесть недель после создания первой beta наступает время стабильного выпуска! Ветка stable производится из ветки beta:
nightly: * - - * - - * - - * - - * - - * - * - *
|
beta: * - - - - - - - - *
|
stable: *
Ура! Rust 1.5 готов! Однако мы забыли об одном: поскольку прошло шесть недель, нам также нужна новая beta следующей версии Rust, 1.6. Так что после того, как stable отделяется от beta, следующая версия beta снова отделяется от nightly:
nightly: * - - * - - * - - * - - * - - * - * - *
| |
beta: * - - - - - - - - * *
|
stable: *
Это называется «моделью поездов», потому что каждые шесть недель выпуск «отправляется со станции», но всё ещё должен пройти через канал beta, прежде чем стать стабильным выпуском.
Rust выпускается каждые шесть недель, как часы. Если вы знаете дату одного выпуска Rust, вы можете знать дату следующего: через шесть недель. Приятный аспект выпусков, запланированных каждые шесть недель, в том, что следующий поезд скоро приходит. Если функциональность пропускает particular выпуск, не нужно беспокоиться: следующий произойдёт в короткое время! Это помогает снизить давление, чтобы втиснуть возможно неотполированные функциональности вблизи срока выпуска.
Благодаря этому процессу вы всегда можете проверить следующую сборку Rust и убедиться, что обновление до неё простое: если beta-выпуск не работает как ожидается, вы можете сообщить об этом команде и исправить до следующего стабильного выпуска! Поломки в beta-выпуске относительно редки, но rustc всё ещё является программным обеспечением, и ошибки существуют.
Период поддержки
Проект Rust поддерживает последнюю стабильную версию. Когда выпускается новая стабильная версия, старая версия достигает конца срока поддержки (EOL). Это означает, что каждая версия поддерживается шесть недель.
Нестабильные функциональности
С этой моделью выпуска есть ещё одна особенность: нестабильные функциональности. Rust использует технику под названием «флаги функциональности», чтобы определить, какие функциональности включены в данном выпуске. Если новая функциональность находится в активной разработке, она попадает в master, а следовательно, в nightly, но за флагом функциональности. Если вы, как пользователь, хотите попробовать функциональность в разработке, вы можете, но вы должны использовать nightly-выпуск Rust и аннотировать ваш исходный код соответствующим флагом, чтобы присоединиться.
Если вы используете beta или стабильный выпуск Rust, вы не можете использовать никакие флаги функциональности. Это ключ, который позволяет нам получать практическое использование новых функциональностей, прежде чем объявить их стабильными навсегда. Те, кто хочет присоединиться к переднему краю, могут это сделать, а те, кто хочет надёжного опыта, могут придерживаться стабильного и знать, что их код не сломается. Стабильность без застоя.
Эта книга содержит только информацию о стабильных функциональностях, поскольку функциональности в разработке всё ещё меняются, и они, безусловно, будут отличаться между написанием этой книги и их включением в стабильные сборки. Документацию по функциональностям только для nightly можно найти онлайн.
Rustup и роль Rust Nightly
Rustup упрощает переключение между разными каналами выпуска Rust, глобально или для каждого проекта. По умолчанию у вас будет установлен стабильный Rust. Чтобы установить nightly, например:
$ rustup toolchain install nightly
Вы также можете увидеть все наборы инструментов (выпуски Rust и связанные компоненты), которые у вас установлены с помощью rustup. Вот пример на компьютере одного из авторов под 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
Теперь каждый раз, когда вы вызываете rustc или cargo внутри ~/projects/needs-nightly, rustup убедится, что вы используете nightly Rust, а не стабильный Rust по умолчанию. Это пригодится, когда у вас много проектов на Rust!
Процесс RFC и команды
Так как же вы узнаёте об этих новых функциональностях? Модель разработки Rust следует процессу запроса комментариев (RFC). Если вы хотите улучшения в Rust, вы можете написать предложение, называемое RFC.
Любой может писать RFC для улучшения Rust, и предложения рассматриваются и обсуждаются командой Rust, которая состоит из многих тематических подкоманд. Полный список команд on Rust’s website, который включает команды для каждой области проекта: дизайн языка, реализация компилятора, инфраструктура, документация и другие. Соответствующая команда читает предложение и комментарии, пишет свои собственные комментарии, и в конце концов достигается консенсус по принятию или отклонению функциональности.
Если функциональность принята, issue открывается в репозитории Rust, и кто-то может её реализовать. Тот, кто реализует её, очень хорошо может не быть тем, кто предложил функциональность изначально! Когда реализация готова, она попадает в ветку master за флагом функциональности, как мы обсуждали в разделе “Нестабильные функциональности”.
Через некоторое время, как только разработчики Rust, использующие nightly-выпуски, смогут попробовать новую функциональность, члены команды обсудят функциональность, как она работает на nightly, и решат, должна ли она попасть в стабильный Rust или нет. Если решение — двигаться вперёд, флаг функциональности удаляется, и функциональность теперь считается стабильной! Она едет на поездах в новый стабильный выпуск Rust.