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

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

必要なものを適宜追加するスタイルになるので、そもそも差分を考慮するのが面倒であれば、 rustupcurl 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.tomlCargo の依存パッケージの定義やソースコードのエントリポイントの指定などを行うための設定ファイルです。

補足として、ディレクトリ自体も含めたまっさらな状態から 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

と書けば nightly2018-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 向けの機能と考えた方が良いでしょう。

参考にさせていただいたサイト