Avatar ·

Как переключаться между разными версиями и тулчейнами Rust с помощью rustup?

Привет! Я недавно начал изучать Rust и столкнулся с проблемой: у меня есть несколько проектов, которые требуют разных версий компилятора. Один проект использует стабильный Rust 1.60, а другой — nightly, потому что там нужны экспериментальные фичи. Я установил Rust через `rustup`, но не понимаю, как правильно переключаться между этими тулчейнами. Вот что я делаю: когда я захожу в папку с проектом, который требует nightly, я вручную запускаю `rustup default nightly`, но потом, когда перехожу к другому проекту, мне нужно снова менять дефолтный тулчейн. Это очень неудобно, и я боюсь что-то сломать. Я слышал, что есть файлы `rust-toolchain.toml` или `rust-toolchain`, но не до конца понимаю, как их использовать. Также я пробовал запускать `rustup run nightly cargo build`, но это кажется костылём. Можете объяснить, как правильно и безболезненно переключаться между тулчейнами в разных проектах? Хочется, чтобы каждый проект сам «знал», какой тулчейн ему нужен, и при входе в папку автоматически подхватывалась правильная версия. Заранее спасибо! <<>>

Автоматическое переключение тулчейнов с помощью rustup и файлов конфигурации

Вы на правильном пути: использовать rustup default для каждого проекта — это действительно неудобно и чревато ошибками. К счастью, в rustup есть встроенный механизм, который автоматически определяет нужный тулчейн на основе файла rust-toolchain.toml (или rust-toolchain) в корне проекта. Это стандартный и рекомендуемый способ.

Вот как это работает: rustup при каждом вызове rustc, cargo или других инструментов проверяет текущую директорию и все родительские директории на наличие файла rust-toolchain.toml или rust-toolchain. Если такой файл найден, он автоматически использует указанный тулчейн, игнорируя глобальный дефолт.

Шаг 1: Создание файла rust-toolchain.toml (рекомендуемый формат)

Создайте в корне вашего проекта файл rust-toolchain.toml со следующим содержимым:

[toolchain]
channel = "nightly"
# Опционально: можно указать конкретную дату
# channel = "nightly-2024-01-01"
# Или компоненты, которые нужно установить
components = ["rustfmt", "clippy"]
# Или цели для кросс-компиляции
targets = ["wasm32-unknown-unknown"]

Для стабильного тулчейна просто укажите channel = "stable" или конкретную версию, например channel = "1.60.0".

Шаг 2: Как это работает на практике

Предположим, у вас есть два проекта:

  • /projects/stable_app/ — требует стабильный Rust.
  • /projects/nightly_app/ — требует nightly.

В каждом из них вы создаёте соответствующий файл rust-toolchain.toml. Теперь, когда вы переходите в терминале в папку nightly_app и запускаете cargo build, rustup автоматически переключается на nightly. При переходе в stable_app — на стабильный. Вам больше не нужно вручную менять дефолт.

Шаг 3: Старый формат (rust-toolchain)

Раньше использовался простой текстовый файл rust-toolchain без расширения, в котором просто писали имя канала: nightly или stable. Этот формат всё ещё работает, но rust-toolchain.toml предпочтительнее, так как позволяет задавать компоненты и цели.

Пример для вашего случая

Для проекта, требующего nightly:

# В файле rust-toolchain.toml
[toolchain]
channel = "nightly"
components = ["rustfmt", "clippy"]

Для проекта на стабильной версии 1.60:

# В файле rust-toolchain.toml
[toolchain]
channel = "1.60.0"

Дополнительные советы

  • Проверка активного тулчейна: Используйте rustup show, чтобы увидеть, какой тулчейн активен в текущей директории.
  • Установка тулчейна, если его нет: Если указанный в файле тулчейн не установлен, rustup предложит его установить при первом запуске cargo.
  • Глобальный дефолт: Вы можете оставить глобальный дефолт на стабильной версии (например, rustup default stable), а для проектов, которым нужен nightly, использовать файлы конфигурации. Это самый безопасный подход.

Таким образом, вы решаете проблему раз и навсегда: каждый проект сам "говорит" компилятору, какую версию использовать, и вам не нужно думать о ручном переключении.

<<>>

Использование директивы `override` и временное переключение

Если вы не хотите создавать файлы в каждом проекте (например, для быстрого тестирования или одноразовых задач), можно использовать команду rustup override set. Она устанавливает тулчейн для конкретной директории, но не создаёт файл конфигурации — информация хранится в служебных файлах rustup.

Пример:

cd /projects/my_nightly_project
rustup override set nightly
# Теперь в этой папке и всех её подпапках будет использоваться nightly
cargo build

Чтобы увидеть список всех переопределений, выполните:

rustup override list

Для удаления переопределения и возврата к глобальному дефолту используйте:

rustup override unset

Недостаток: В отличие от файла rust-toolchain.toml, переопределение не является частью репозитория — его не увидят другие разработчики. Поэтому для командных проектов или проектов с открытым исходным кодом лучше использовать файл конфигурации. Однако для личных экспериментов или временных задач override очень удобен.

Также вы можете комбинировать оба подхода: использовать файл rust-toolchain.toml для долгосрочных проектов, а override — для быстрых проверок.