Додаток G - Як створюється Rust і «Nightly Rust»
Цей додаток присвячений тому, як створюється Rust і як це впливає на вас як на Rust розробника.
Стабільність без застою
Як мова, Rust дуже дбає про стабільність вашого коду. Ми хочемо, щоб Rust був міцною основою, на якій ви можете будувати, і якби все постійно змінювалося, це було б неможливо. Водночас, якщо ми не можемо експериментувати з новими можливостями, ми можемо не виявити важливі вади аж до після їхнього випуску, коли ми вже не зможемо нічого змінити.
Наше рішення цієї проблеми — це те, що ми називаємо «стабільністю без застою», і наш керівний принцип такий: ви ніколи не повинні боятися оновлюватися до нової версії stable Rust. Кожне оновлення має бути безболісним, але також має приносити вам нові можливості, менше помилок і швидші часи компіляції.
Чух, чух! Канали випуску та поїздки потягами
Розробка Rust працює за розкладом потягів. Тобто вся розробка виконується в головній гілці репозиторію Rust. Випуски дотримуються моделі release train для програмного забезпечення, яка використовувалася Cisco IOS та іншими програмними проєктами. Є три канали випуску для Rust:
- Nightly
- Beta
- Stable
Більшість розробників Rust переважно використовують stable канал, але ті, хто хоче спробувати експериментальні нові можливості, можуть використовувати nightly або beta.
Ось приклад того, як працює процес розробки та випуску: припустімо, що команда Rust працює над випуском Rust 1.5. Цей випуск відбувся в грудні 2015 року, але він дасть нам реалістичні номери версій. До Rust додається нова можливість: новий commit потрапляє в головну гілку. Кожної ночі створюється нова nightly-версія Rust. Кожен день є днем випуску, і ці випуски автоматично створюються нашою інфраструктурою випуску. Тож із плином часу наші випуски виглядають так, щоразу вночі:
nightly: * - - * - - *
Кожні шість тижнів настає час готувати новий випуск! Гілка beta репозиторію
Rust відгалужується від головної гілки, яку використовує nightly. Тепер
є два випуски:
nightly: * - - * - - *
|
beta: *
Більшість користувачів Rust не використовують beta-випуски активно, але тестують beta у своїй CI-системі, щоб допомогти Rust виявляти можливі регресії. Тим часом nightly-випуск усе ще виходить щоночі:
nightly: * - - * - - * - - * - - *
|
beta: *
Припустімо, що виявлено регресію. Добре, що ми встигли трохи протестувати beta
випуск до того, як регресія прослизнула в stable-випуск! Виправлення застосовується до
головної гілки, тож nightly виправлено, а потім виправлення переноситься назад у
гілку beta, і створюється новий beta-випуск:
nightly: * - - * - - * - - * - - * - - *
|
beta: * - - - - - - - - *
Через шість тижнів після створення першої beta настав час stable-випуску! Гілка
stable створюється з гілки beta:
nightly: * - - * - - * - - * - - * - - * - * - *
|
beta: * - - - - - - - - *
|
stable: *
Ура! Rust 1.5 завершено! Однак ми забули про одну річ: оскільки минуло шість
тижнів, нам також потрібна нова beta наступної версії Rust, 1.6.
Тож після того, як stable відгалужується від beta, наступна версія beta знову
відгалужується від nightly:
nightly: * - - * - - * - - * - - * - - * - * - *
| |
beta: * - - - - - - - - * *
|
stable: *
Це називається «модель потягів», тому що кожні шість тижнів випуск «від’їжджає зі станції», але все ще має пройти подорож через beta-канал, перш ніж прибути як stable-випуск.
Rust випускається кожні шість тижнів, як годинник. Якщо ви знаєте дату одного випуску Rust, ви можете знати дату наступного: це через шість тижнів. Гарний аспект того, що випуски заплановані кожні шість тижнів, полягає в тому, що наступний потяг невдовзі прибуває. Якщо якась можливість випадково пропустить певний випуск, немає потреби хвилюватися: ще один відбудеться за короткий час! Це допомагає зменшити тиск щоб проштовхувати, можливо, недопрацьовані можливості близько до дедлайну випуску.
Завдяки цьому процесу ви завжди можете перевірити наступну збірку Rust і
переконатися самі, що на неї легко оновитися: якщо beta-випуск не
працює так, як очікувалося, ви можете повідомити про це команді й отримати виправлення до того,
як відбудеться наступний stable-випуск! Порушення в beta-випуску є відносно рідкісним, але
rustc все ще є програмним забезпеченням, а помилки все ж існують.
Час обслуговування
Проєкт Rust підтримує найсвіжішу стабільну версію. Коли виходить нова стабільна версія, стара версія досягає кінця свого життя (EOL). Це означає, що кожна версія підтримується протягом шести тижнів.
Нестабільні можливості
Є ще одна пастка в цій моделі випуску: нестабільні можливості. Rust використовує техніку, яка називається “feature flags”, щоб визначити, які можливості увімкнені в даному випуску. Якщо нова можливість перебуває в активній розробці, вона потрапляє в головну гілку, а отже, у nightly, але за feature flag. Якщо ви, як користувач, хочете спробувати можливість, що перебуває в розробці, ви можете, але ви повинні використовувати nightly-випуск Rust і позначити ваш вихідний код відповідним flag, щоб увімкнути її.
Якщо ви використовуєте beta- або stable-випуск Rust, ви не можете використовувати жодні feature flags. Це ключ, який дозволяє нам практично використовувати нові можливості до того, як ми оголосимо їх назавжди стабільними. Ті, хто хоче перейти на bleeding edge, можуть це зробити, а ті, хто хоче міцний, надійний досвід, можуть залишитися зі stable і знати, що їхній код не зламається. Стабільність без застою.
У цій книзі міститься лише інформація про стабільні можливості, оскільки можливості, що перебувають у розробці, все ще змінюються, і, безперечно, вони будуть іншими між тим, коли ця книга була написана, і тим, коли їх увімкнуть у stable-збірках. Ви можете знайти документацію для можливостей лише для nightly онлайн.
Rustup і роль Rust Nightly
Rustup полегшує перемикання між різними каналами випуску Rust, на глобальній або проєктній основі. За замовчуванням у вас буде встановлено stable Rust. Щоб встановити nightly, наприклад:
$ rustup toolchain install nightly
Ви також можете побачити всі toolchain (випуски 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
Як бачите, stable toolchain є типовим. Більшість користувачів Rust використовують stable
переважно. Ви, можливо, захочете використовувати stable більшість часу, але використовувати
nightly для конкретного проєкту, тому що вас цікавить cutting-edge можливість.
Щоб зробити це, ви можете використати rustup override у каталозі цього проєкту, щоб установити
nightly toolchain як ту, яку rustup має використовувати, коли ви перебуваєте в цьому каталозі:
$ cd ~/projects/needs-nightly
$ rustup override set nightly
Тепер кожного разу, коли ви викликаєте rustc або cargo всередині
~/projects/needs-nightly, rustup подбає про те, щоб ви використовували nightly
Rust, а не ваш типовий stable Rust. Це стає у пригоді, коли у вас
є багато проєктів Rust!
Процес RFC і команди
Тож як ви дізнаєтеся про ці нові можливості? Модель розробки Rust дотримується процесу Request For Comments (RFC). Якщо ви хочете покращення в Rust, ви можете написати пропозицію, яка називається RFC.
Будь-хто може писати RFC, щоб покращити Rust, і пропозиції переглядаються та обговорюються командою Rust, яка складається з багатьох тематичних підкоманд. Повний список команд є на вебсайті Rust, який включає команди для кожної сфери проєкту: дизайну мови, реалізації компілятора, інфраструктури, документації та іншого. Відповідна команда читає пропозицію та коментарі, пише кілька власних коментарів і, зрештою, досягається консенсус щодо прийняття або відхилення можливості.
Якщо можливість прийнято, у репозиторії Rust відкривається issue, і хтось може реалізувати її. Людина, яка реалізує її, цілком можливо, не є тією самою людиною, яка спочатку запропонувала можливість! Коли реалізація готова, вона потрапляє в головну гілку за feature gate, як ми обговорювали в розділі “Нестабільні можливості”.
Через деякий час, коли розробники Rust, які використовують nightly-випуски, зможуть спробувати нову можливість, члени команди обговорять можливість, те, як вона працювала в nightly, і вирішать, чи має вона потрапити в stable Rust, чи ні. Якщо рішення — рухатися далі, feature gate видаляється, і можливість тепер вважається стабільною! Вона їде потягами до нового stable-випуску Rust.