RustupでRustの環境構築をする - インストールからツールチェインの固定まで

プログラミング言語 Rust を学習する必要がでてきたので、 環境構築手順をまとめたいと思います。
今回はMacOS X上で Homebrew を使ってインストールする手順になります。
Rustupをインストールする
まずは、 rustup をインストールします。
1brew install rustuprustup をインストールしただけだと使えないので、以下のコマンドで初期化を行います。
1rustup-init${HOME}/.zshrc や ${HOME}/.bashrc などにパスを通して export します。
1export CARGO_HOME="$HOME/.cargo"
2export PATH="$CARGO_HOME/bin:$PATH"コマンドが利用可能かを確認します。
まずはコンパイルに使う rustc コマンド。
1rustc -V
2> rustc 1.30.0 (da5f414c2 2018-10-24)次にビルド兼パッケージマネージャの cargo コマンド。
1cargo -V
2> cargo 1.30.0 (36d96825d 2018-10-24)なお、 show のサブコマンドで、現在有効なツールチェーンを確認できます。
1rustup show
2> Default host: x86_64-apple-darwin
3>
4> stable-x86_64-apple-darwin (default)
5> rustc 1.30.0 (da5f414c2 2018-10-24)不足しているコンポーネントをインストールする
Homebrew 経由でのインストールと、
公式ページで紹介されているコマンド curl https://sh.rustup.rs -sSf | sh では
インストールされるツールチェーンに若干の差分があります。
例えば、 rustfmt コマンドが Homebrew 経由の場合はデフォルトでインストールされません。
そのため、 component サブコマンドで別途インストールしてあげる必要がありそうです。
1rustup component add rustfmt-preview --toolchain stable-x86_64-apple-darwin必要なものを適宜追加するスタイルになるので、そもそも差分を考慮するのが面倒であれば、
rustup を curl https://sh.rustup.rs -sSf | sh でインストールした方が良いかもしれません。
プロジェクトを初期化する
任意のディレクトリ配下をCargoプロジェクトとしたいときには、 cargo init コマンドを使います。
1cargo init --vcs git --bin --bin は、init 時にアプリケーション実装のためのテンプレートを出力するオプションです。
現在の Cargo バージョン 1.30.0 ではデフォルトで有効になっているオプションなので、省略することもできます。
また、 --vcs オプションは、利用するVCSの設定ファイルも出力してくれるので便利です。
例えば、 --vcs git とすると、 .git や .gitignore を吐き出してくれます。
先程のディレクトリ内に出力された結果を見てみましょう。
1#tree -a
2.
3├── .git
4│ ├── HEAD
5│ (中略)
6│ └── refs
7│ ├── heads
8│ └── tags
9├── .gitignore
10├── Cargo.toml
11└── src
12 └── main.rssrc 配下にコードのエントリポイントとなる main.rs が、
プロジェクトルートに Cargo.toml が出力されていることがわかります。
Cargo.toml は Cargo の依存パッケージの定義やソースコードのエントリポイントの指定などを行うための設定ファイルです。
補足として、ディレクトリ自体も含めたまっさらな状態から Cargo プロジェクトを新規作成するには、
cargo new コマンドを使うと良いです。
ツールチェインを固定する
環境差分を減らす仕組みは、チーム開発する上での重要な下準備となります。
Rust においても同様で、ここではツールチェインのバージョンを固定します。
Rustupの公式 に記載があったので引用すると、Rustupによって、プロジェクト毎に使うツールチェインを指定することができ、その設定の優先順位は以下のようになります。
- An explicit toolchain, e.g. cargo +beta,
- The RUSTUP_TOOLCHAIN environment variable,
- A directory override, ala rustup override set beta,
- The rust-toolchain file,
- The default toolchain,
チームで環境を統一するのであれば、rust-toolchain ファイルを使う方法が一番適していそうです。
早速試してみます。プロジェクトルート直下に rust-toolchain ファイルを作成し、以下のフォーマットの文字列を書き込むことでツールチェインを固定できます。
1<channel>[-<date>][-<host>]
2
3<channel> = stable|beta|nightly|<version>
4<date> = YYYY-MM-DD
5<host> = <target-triple>例えば
11.20.0と書けば stable チャンネル(デフォルト)の 1.20.0 を指定することになります。
1nightly-2018-10-01と書けば nightly の 2018-10-01 を指定することになります。
その後、 cargo check でも cargo build でも良いのですが、コマンドを実行すると、
ツールチェインがインストールされます。
余談:日付指定時に取得できるツールチェインはどれか
ツールチェインの日付文字列による指定の場面で、「どの日時を記述してもツールチェインがインストールできるのか?」と疑問を持ったので調査してみます。
異なる日付を指定して cargo check コマンドの標準出力を確認します。以下は一部を抜粋したものです。同じ 1.31.0-nightly にも関わらず、コミットハッシュが異なることが確認できます。 指定日付時点での最新のコミット が採用されている印象を受けます。
1# rust-toolchainに nightly-2018-10-10 を書いた場合
2info: latest update on 2018-10-10, rust version 1.31.0-nightly (96cafc53c 2018-10-09)
3
4# rust-toolchainに nightly-2018-10-09 を書いた場合
5info: latest update on 2018-10-09, rust version 1.31.0-nightly (423d81098 2018-10-08)チャンネルが nightly の場合においては、概ねどの日付を指定してもインストールできました。
逆にリリース頻度の低い stable チャンネルでは、日付を指定しても取得できない場合がありました。
1error: no release found for 'stable-2018-10-10'そのため、日付指定は nightly 向けの機能と考えた方が良いでしょう。
