rust-toolchain.tomlを書こう

自己紹介

スライドのQRコード

@H1rono_K

本題

モチベーション

Rustのバージョンを揃えたい!

  • .tool-versionsを書く?
    • しかしasdfに依存してしまう
    • プロジェクトメンバーにasdfを強要するのは...
    • GitHub Actionsでも取り回しが良くない
  • rustup override set ...のコマンドを各自で実行してもらう?
    • READMEに書くのが手間

rust-toolchain.tomlを書こう

rust-toolchain.tomlでできること

rustの構成をディレクトリごとに指定できる

使用可能なrustupのバージョンは?

rustcのバージョンではなくrustupのバージョンです

rustup/CHANGELOG.md #1.24.0 - 2021-04-27 より一部抜粋

Support of rust-toolchain.toml as a filename for specifying toolchains.

遥か昔から使える → バージョン問題は気にしなくていい

(最新のrustupバージョンは1.26.0)

VS rust-toolchain

.toml拡張子無しのファイルでも同様のことができるが、どちらを使うべきか

同リリースより一部抜粋↓

Since Cargo is migrating to explicit .toml extensions on things like .cargo/config.toml it was considered sensible to also do this for rust-toolchain - at least the toml variant thereof.

.tomlを明示しようという流れがあるらしい

実際の使用例 - ファイル例

rust-toolchain.tomlの記述例

[toolchain]
channel = "1.70.0"
components = ["rustc", "cargo"]
profile = "minimal"
targets = []

componentsrustccargoを明示しているが、
minimalプロファイルで暗示されているため実際は不要

実際の使用例 - バージョン確認

Raspberry Pi 4B - Ubuntu 22.04 での実行例

スクショ

rustup showrust-toolchain.tomlが効いていることを確認できる

実際の使用例 - ビルド

cargoなどを実行したタイミングでもバージョンが切り替わる

スクショ2

バージョン切り替え・インストールのコマンドを実行する必要がない

CI環境でも便利

例: GitHub Actionsでは最初からrustupが入っている
→バージョン変更のコマンド実行がいらない

他CI環境でも(調べた限りは)同様

MSRVの決定でも便利 1

※ MSRV: Minimum Supported Rust Version

gha-fail.png

channel指定が古すぎてGHAが落ちた例

  • cargo-msrvを手作業で実行している感じ
  • このスクショがいい例 (実際のPR)
    • ここでは1.64.0から1.67.1にMSRVが上がった

MSRVの決定でも便利 2

  • ただし、わかるのは「現在のコードでビルドが通る最低のRustバージョン」である点に注意
    • 前方互換性を考えるとMSRVはここで判明するものより高い
    • 依存関係のMSRVにも影響を受ける
      →featureの組み合わせ次第で変わりうる
  • あくまで参考指標の一つ

まとめ

  • rustup + rust-toolchain.tomlは最強

ref

おまけ: Nixでは?

nix-community/fenixoxalica/rust-overlayrust-toolchain.tomlを読んで適切なtoolchainを入れられる
rustupなしで同様のことが実現可能

rust-toolachain.tomlで設定を一本化できる!!

```bash ~$ rustup show ... (デフォルト) ~$ cd path/to/hoge ~/path/to/hoge$ cat rust-toolchain.toml ... ~/path/to/hoge$ rustup show ... (オーバーライド) ```

```bash ~/path/to/hoge$ cargo build ... (バージョンが切り替わる) ```