RustupでRustの環境構築をする - インストールからツールチェインの固定まで
プログラミング言語 Rust を学習する必要がでてきたので、 環境構築手順をまとめたいと思います。
今回はMacOS X上で Homebrew を使ってインストールする手順になります。
Rustupをインストールする
まずは、 rustup
をインストールします。
1brew install rustup
rustup
をインストールしただけだと使えないので、以下のコマンドで初期化を行います。
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.rs
src
配下にコードのエントリポイントとなる 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
向けの機能と考えた方が良いでしょう。