Rust 1.74.0: конфигурация проверки в Cargo, авторизация для приватных реестров, проекции возвращаемых типов

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Команда Rust рада сообщить о новой версии языка — 1.74.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.


Если у вас есть предыдущая версия Rust, установленная через rustup, то для обновления до версии 1.74.0 вам достаточно выполнить команду:


rustup update stable

Если у вас ещё не установлен rustup, вы можете установить его с соответствующей страницы нашего веб-сайта, а также посмотреть подробные примечания к выпуску на GitHub.


Если вы хотите помочь нам протестировать будущие выпуски, вы можете использовать beta (rustup default beta) или nightly (rustup default nightly) канал. Пожалуйста, сообщайте обо всех встреченных вами ошибках.


Что стабилизировано в 1.74.0


Настройка проверок при помощи Cargo


Как было предложено в RFC 3389, файл Cargo.toml теперь поддерживает таблицу [lints] для настройки уровня сообщений (forbid, deny, warn, allow) для проверок от компилятора и других инструментов. Таким образом, вместо установки RUSTFLAGS в -F/-D/-W/-A (что повлияло бы на всю сборку) или использования атрибутов уровня крейта:


#![forbid(unsafe_code)]
#![deny(clippy::enum_glob_use)]

Вы можете просто указать уровни сообщений в манифесте пакета, и они будут обработаны Cargo:


[lints.rust]
unsafe_code = "forbid"

[lints.clippy]
enum_glob_use = "deny"

Также их можно настроить в таблице [workspace.lints], и затем они будут унаследованы [lints] workspace = true, как и многие другие параметры рабочей области. Cargo также будет отслеживать изменения в этих настройках при принятии решения о том, какие крейты необходимо пересобрать.


Для получения дополнительной информации смотрите разделы lints и workspace.lints справочного руководства по Cargo.


Авторизация в Cargo Registry


В этот выпуск включены ещё две связанные с Cargo функции: провайдеры учётных данных и аутентификация для приватных реестров.


Провайдеры авторизации позволяют настраивать способ, которым Cargo получает учётные данные для реестра. Встроенные провайдеры включены для безопасных секретных хранилищ, специфичных для конкретной операционной системы, в Linux, macOS и Windows. Кроме того, для поддержки произвольных методов хранения или генерации токенов могут быть созданы сторонние провайдеры. Использование защищённых провайдеров учётных данных снижает риск утечки токенов реестра.


Дополнительно реестры теперь могут требовать аутентификацию для всех операций, а не только для публикации. Это позволяет приватным реестрам предлагать более безопасное размещение крейтов. Использование приватных реестров требует настройки провайдера авторизации.


Более подробную информацию смотрите в документации Cargo.


Проекции в непрозрачных возвращаемых типах


Если вы когда-либо получали сообщение об ошибке вроде "return type cannot contain a projection or Self that references lifetimes from a parent scope", то можете теперь быть спокойны! Компилятор позволяет упоминать Self и связанные с ним типы в непрозрачных возвращаемых типах, таких как async fn и -> impl Trait. Благодаря улучшениям вроде этого Rust лучше соответствует вашим интуитивным ожиданиям от него, даже если вы понятия не имеете о таких элементах технического жаргона, как "проекция".


Эта функциональность имела статус нестабильной, потому что изначально её реализация неправильно обрабатывала захваченные времена жизни. Как только это было исправлено, разработчики сделали паузу и убедились, что она не содержит ошибок, ведущих к неопределённом поведению. Для получения более подробной технической информации смотрите запрос на стабилизацию, в котором описаны все примеры, которые теперь разрешены:


struct Wrapper<'a, T>(&'a T);

// Непрозрачные возвращаемые типы, в которых упоминается "Self`:
impl Wrapper<'_, ()> {
    async fn async_fn() -> Self { /* ... */ }
    fn impl_trait() -> impl Iterator<Item = Self> { /* ... */ }
}

trait Trait<'a> {
    type Assoc;
    fn new() -> Self::Assoc;
}
impl Trait<'_> for () {
    type Assoc = ();
    fn new() {}
}

// Непрозрачный возвращаемый тип, в котором упоминается связанный тип:
impl<'a, T: Trait<'a>> Wrapper<'a, T> {
    async fn mk_assoc() -> T::Assoc { /* ... */ }
    fn a_few_assocs() -> impl Iterator<Item = T::Assoc> { /* ... */ }
}

Стабилизированные API


  • core::num::Saturating
  • impl From<io::Stdout> for std::process::Stdio
  • impl From<io::Stderr> for std::process::Stdio
  • impl From<OwnedHandle> for std::process::Child{Stdin, Stdout, Stderr}
  • impl From<OwnedFd> for std::process::Child{Stdin, Stdout, Stderr}
  • std::ffi::OsString::from_encoded_bytes_unchecked
  • std::ffi::OsString::into_encoded_bytes
  • std::ffi::OsStr::from_encoded_bytes_unchecked
  • std::ffi::OsStr::as_encoded_bytes
  • std::io::Error::other
  • impl TryFrom<char> for u16
  • impl<T: Clone, const N: usize> From<&[T; N]> for Vec<T>
  • impl<T: Clone, const N: usize> From<&mut [T; N]> for Vec<T>
  • impl<T, const N: usize> From<[T; N]> for Arc<[T]>
  • impl<T, const N: usize> From<[T; N]> for Rc<[T]>

Следующие API теперь можно использовать в контексте const:


  • core::mem::transmute_copy
  • str::is_ascii

Замечания о совместимости


  • Как было [сообщено ранее], Rust 1.74 повышает требования к платформам Apple. Теперь минимальные версии такие:
    • macOS: 10.12 Sierra (первый выпуск 2016)
    • iOS: 10 (первый выпуск 2016)
    • tvOS: 10 (первый выпуск 2016)

Прочие изменения


Посмотрите все изменения в Rust, Cargo и Clippy.


Участники 1.74.0


Многие люди собрались вместе, чтобы создать Rust 1.74.0. Без вас мы бы не справились. Спасибо!


От переводчиков


С любыми вопросами по языку Rust вам смогут помочь в русскоязычном Телеграм-чате или же в аналогичном чате для новичковых вопросов. Если у вас есть вопросы по переводам или хотите помогать с ними, то обращайтесь в чат переводчиков.


Данную статью совместными усилиями перевели Browning, TelegaOvoshey и funkill.

Источник: https://habr.com/ru/articles/775076/


Интересные статьи

Интересные статьи

Этот пост будет довольно сумбурным. Несколько месяцев назад я написал Hard Mode Rust, исследуя стиль программирования allocation-conscious. В последовавшей дискуссии @jamii упомянул TigerBeetle — ра...
Моя прошлая статья заканчивалась тем, что у меня возникла проблема выбора на чем писать и я говорил, что в следующей части продолжу свое изложение как сравнение Rust и C++.  Но проблема на тот мо...
Используя машинное обучение, мы можем создать нашу собственную программу проверки на плагиат, которая выполняет поиск украденного контента в огромной базе данных. В этой статье мы сделаем  д...
Всем привет! В ОС Аврора мы уделяем большое внимание обеспечению безопасности. Сегодня немного расскажем о перспективном подходе — синергии технологии ARM TrustZone и open-source прое...
Важно: для комфортного прочтения статьи нужно уметь читать исходный код на Rust и понимать, почему оборачивать всё в Rc<RefCell<...>> — плохо. Введение Rust не при...