Rust + Vim の開発環境を整える際の動く nightly の探し方

(追記: termoshtt さんから、最近 1 週間の状況なら https://rust-lang.github.io/rustup-components-history/x86_64-apple-darwin.html で確認できるとのこと)

プロジェクトで最新の `nightly` を使おうとした時に、ソースコードのコンパイルは通っても、開発支援ツールのダウンロードやインストールに失敗することがあります。

# 探し方

まずは適当なディレクトリで `$ cargo init` します。これはこの後の試行錯誤の時間を短くするためです。

```sh
$ cd /tmp
$ cargo init foo
$ cd foo/
```

後は `rust-toolchain` を追加し、日付を徐々に古くしつつチェック用の一連のインストールコマンドを実行していきます。

※ `rust-toolchain` については[この辺り](https://github.com/rust-lang/rustup.rs/tree/e44868f0f3560da2400d8e34c792f5402798b528#the-toolchain-file)をご参考に。

記事を書いている時点での最新の `nightly` は `nightly-2019-10-31` なので、そこから試していきます。

```sh
$ echo nightly-2019-10-31 > rust-toolchain; cargo check && rustup component add rustfmt rust-analysis rust-src rls-preview && cargo install racer --force
    Checking foo v0.1.0 (/private/tmp/foo)
    Finished dev [unoptimized + debuginfo] target(s) in 0.35s
info: component 'rustfmt' for target 'x86_64-apple-darwin' is up to date
info: component 'rust-analysis' for target 'x86_64-apple-darwin' is up to date
info: component 'rust-src' is up to date
error: component 'rls' for target 'x86_64-apple-darwin' is unavailable for download for channel nightly-2019-10-31
```

失敗しました。次は `nightly-2019-10-30` を試していきます。

```sh
$ echo nightly-2019-10-30 > rust-toolchain; cargo check && rustup component add rustfmt rust-analysis rust-src rls-preview && cargo install racer --force
...(省略)...
error: component 'rls' for target 'x86_64-apple-darwin' is unavailable for download for channel nightly-2019-10-30
```

失敗しました。といった感じで、どんどん試していきます。

```sh
$ echo nightly-2019-10-29 > rust-toolchain; cargo check && rustup component add rustfmt rust-analysis rust-src rls-preview && cargo install racer --force
info: syncing channel updates for 'nightly-2019-10-29-x86_64-apple-darwin'
info: latest update on 2019-10-29, rust version 1.40.0-nightly (b497e1899 2019-10-28)
error: component 'clippy' for target 'x86_64-apple-darwin' is unavailable for download for channel nightly-2019-10-29

$ echo nightly-2019-10-28 > rust-toolchain; cargo check && rustup component add rustfmt rust-analysis rust-src rls-preview && cargo install racer --force
...(省略)...
error: component 'rls' for target 'x86_64-apple-darwin' is unavailable for download for channel nightly-2019-10-28

$ echo nightly-2019-10-27 > rust-toolchain; cargo check && rustup component add rustfmt rust-analysis rust-src rls-preview && cargo install racer --force
...(省略)...
error: component 'rls' for target 'x86_64-apple-darwin' is unavailable for download for channel nightly-2019-10-27

$ echo nightly-2019-10-26 > rust-toolchain; cargo check && rustup component add rustfmt rust-analysis rust-src rls-preview && cargo install racer --force
...(省略)...
error: component 'rls' for target 'x86_64-apple-darwin' is unavailable for download for channel nightly-2019-10-26

$ echo nightly-2019-10-25 > rust-toolchain; cargo check && rustup component add rustfmt rust-analysis rust-src rls-preview && cargo install racer --force
...(省略)...
error: component 'clippy' for target 'x86_64-apple-darwin' is unavailable for download for channel nightly-2019-10-25

$ echo nightly-2019-10-24 > rust-toolchain; cargo check && rustup component add rustfmt rust-analysis rust-src rls-preview && cargo install racer --force
error: process didn't exit successfully: `rustc -vV` (exit code: 1)
--- stderr
error: 'rustc' is not installed for the toolchain 'nightly-2019-10-24-x86_64-apple-darwin'
To install, run `rustup component add rustc --toolchain nightly-2019-10-24-x86_64-apple-darwin`
```

`nightly-2019-10-29` から `nightly-2019-10-24` もだめでした。`nightly-2019-10-23` を試します。

```sh
$ echo nightly-2019-10-23 > rust-toolchain; cargo check && rustup component add rustfmt rust-analysis rust-src rls-preview && cargo install racer --force
info: syncing channel updates for 'nightly-2019-10-23-x86_64-apple-darwin'
info: latest update on 2019-10-23, rust version 1.40.0-nightly (d6e4028a0 2019-10-23)
info: downloading component 'cargo'
info: downloading component 'clippy'
...(省略)...
info: downloading component 'rls'
info: installing component 'rls'
    Updating crates.io index
  Installing racer v2.1.28
   Compiling libc v0.2.65
...(省略)...
   Compiling racer v2.1.28
    Finished release [optimized] target(s) in 2m 54s
   Replacing /Users/daichi/.cargo/bin/racer
    Replaced package `racer v2.1.28` with `racer v2.1.28` (executable `racer`)
```

成功しました。というわけで、今回の場合は `nightly-2019-10-23` がちゃんと動く最新の `nightly` とわかりました。

# その他

普段 https://github.com/autozimu/LanguageClient-neovim を使っていまして、その設定内では例えば `rustup run nightly-2019-10-23 rls` が呼ばれるように書かなければならないのですが、`<toolchain>` の部分 (`nightly-2019-10-23`) は必ず指定しなければなりません。`rust-toolchain` を書き換えるたびにこの設定を書き直すのは面倒だし忘れてしまいます。なので自分はこんなふうに書くようにしました。

```vimscript
let g:LanguageClient_serverCommands = {
  \ 'rust': ['rustup', 'run', system("echo -n $(cat rust-toolchain)"), 'rls'],
  \ }
```

https://github.com/hioki-daichi/nvim-config/blob/a745ec49036173685e02024ed43a54f037bb7205/deinlazy.toml#L26-L29