Nightly Rustにおいて、RLSがrustupコマンドでインストールできない時に代わりに探してくれるツール(cargo-rls-install)を作った

:::note alert
[RLSの廃止](https://blog.rust-lang.org/2022/07/01/RLS-deprecation.html)に伴い、本ツールは役割を終えました。
:::

<details><summary>アーカイブ</summary><div>

# <font color="LimeGreen">Cargo-rls-install</font>

### どんなツール?

- この[サイト](https://rust-lang.github.io/rustup-components-history/)のスクレイピングを行い、RLSのビルド状況を確認し、<br>「present」の表示になっている最新の日付のRLSをインストールします。

- [Rust言語](https://www.rust-lang.org/)で作成。

---

### 開発経緯
Rustには、言語の開発状況に応じたStable(正式)、Beta、Nightly(毎晩日替わり)という
3つのチャンネルがあります。<br>
StableとBetaチャンネルにRLSをインストールすることは、いつでもrustupコマンドを
使うことで可能ですが、Nightlyチャンネルだけは、Rust Language Server(RLS)が
正常にビルドできた日のみ、インストールすることができます。<br>
これは、Rust Language Server(RLS)が依存関係にあるClippyという
Rust言語のコーディング支援ツールが、Rust言語の目まぐるしい変更に
付いて行けず、毎週のようにバグが生まれ、ビルドできない日があるため、
その日は、RLSも一緒に壊れてしまうためです。<br>
このため、利用可能なRLSを探す方法を一人ひとりが、調べてコマンドを打つのでは、
非合理的だと考えたので、開発に至りました。

----

#インストール方法

```bash
$ cargo install cargo-rls-install
```

Cargoは、Rust言語に付属しているため、インストール前には、
Rust言語をインストール済みである必要があります。

また、Linux系OSでは、事前にOpenSSLをインストールしている必要があります。

<details><summary>OpenSSLのインストール方法</summary>
<div>

```bash
#Debian系(Ubuntu、Raspbianなど)
$ sudo apt install libssl-dev

# Windows Subsystem for LinuxのまっさらなUbuntu18.04に
# インストールする場合は、追加で2コマンド必要。
$ sudo apt install build-essential
$ sudo apt install pkg-config

#RedHat系(CentOSなど)
$ sudo yum install openssl-devel

#Fedoraなど
$ sudo dnf install openssl
```

</div></details>

# 特徴

- [Reqwest](https://crates.io/crates/reqwest)というライブラリでHTMLをダウンロードし、[Select](https://crates.io/crates/select)というライブラリで<br>スクレイピングします。

- Rustの3つのチャンネル(stable/beta/nightly)のRLSのインストールに対応しています。

- Cargo(Rustのパッケージマネージャ)から、__1コマンド__でインストールできます。

- Cargoコマンドの__サブコマンド__(```$ cargo <自身が付けたコマンド名>```で実行できる仕組み)なので<br>細かいコマンド名を忘れていても`$ cargo list`と打てば、名前が出てきます。

# 使い方(Nightly -> Stable -> Betaの順で説明します。)

### Nightly Rust向けのコマンド

```bash
# Nightly RustとRLSをインストール(各コマンド実行の直前にyes/noを選択)
$ cargo rls-install -n
# 又は
$ cargo rls-install --nightly

# Nightly RustとRLSをインストール(最後までyesを打った扱いで処理)
$ cargo rls-install -ny
```

### Stable Rust向けのコマンド

```bash
# Stable RustとRLSをインストール(各コマンド実行の直前にyes/noを選択)
$ cargo rls-install -s   # 又は --stable
```

### Beta Rust向けのコマンド

```bash
# Beta RustとRLSをインストール(各コマンド実行の直前にyes/noを選択)
$ cargo rls-install -b   # 又は --beta
```

### チャンネル選びは迷ってしまう方向けのコマンド

```bash
$ cargo rls-install -y
* Select channel
[0:stable, 1:beta, 2:nightly] -> *チャンネル名(stable/beta/nightly)を入力する*
```

### 一週間のビルド状況表示コマンド

現在、デフォルトで使われているRustツールチェインと
一週間のビルド状況が表示されます。

```bash
$ cargo rls-install -v

 * Default use Rust toolchain: nightly-2019-05-12

 * Rust information
 ---------------------------------
 |       Rust & RLS status       |
 ---------------------------------
 | Build date         |  Status  |
 ---------------------------------
 | nightly-2019-05-06 | present  |
 | nightly-2019-05-07 | present  |
 | nightly-2019-05-08 | present  |
 | nightly-2019-05-09 | present  |
 | nightly-2019-05-10 | present  |
 | nightly-2019-05-11 | present  |
 | nightly-2019-05-12 | present  | <= Installed
 ---------------------------------
 |  Last available: 2019-05-12   |
 ---------------------------------
End
```

### rustup component addのラッパーコマンド

主に、rustfmtのインストールする際に、`rustup component add rustfmt --toolchain XX`を
書くのが面倒だったため、追加した機能です。

```bash
$ cargo rls-install -c [コンポーネント名(例: rustfmt)]
# 又は
$ cargo rls-install -f # rustfmtをインストールします。
```

## 参考にしたサイト等

### [GitHub - mexus/rustup-components-history](https://github.com/mexus/rustup-components-history)

[GitHub Pages](https://pages.github.com/)を使って、公開されている[このページ](https://rust-lang.github.io/rustup-components-history/)があったから、
本ツールを作ることができました。

<font color="Red">もし、無くなってしまったら、このツールは使えなくなります。</font>
RLSが使えるかを表示する[似たようなページ](https://rust-lang-nursery.github.io/rust-toolstate/)もありますが、
昨晩のビルド結果を表示するだけのこのページでは、月に数回、3日以上、
壊れたままの状態になるClippy(Rustのコード解析・補完ツール)と
それに依存するRLSの最新版を探すことができません。

朗報、2019年3月9日に[Rustの公式リポジトリ](https://github.com/rust-lang/rustup-components-history)へ取り込まれたため、
将来的に無くなる可能性はほぼ0になりました。(2019年3月10日追記)

### [Rust Language Server(RLS)でVisual Studio Codeの補完を行う（Qiita記事）](https://qiita.com/skitoy4321/items/0bf6826f948720bed821)
本ツールは、この記事を見て、何か最新版のRLSを使い続ける良い方法が
無いかを考えた末の回答です。

### [cargo-version-sync の紹介（Qiita記事）](https://qiita.com/ubnt_intrepid/items/07c7e8e6c3a5d36fbaf3)
本ツールが[Structopt](https://crates.io/crates/structopt)を使っているのは、cargo-version-syncのソースコードの影響です。

### [Rustのイテレータの網羅的かつ大雑把な紹介（Qiita記事）](https://qiita.com/lo48576/items/34887794c146042aebf1)
この記事がなかったら、イテレータを率先して、使っていなかったかもしれません。
[Rust公式のイテレータ解説ページ](https://doc.rust-lang.org/std/iter/trait.Iterator.html)は、読み込みに時間がかかり過ぎて、
ユーザビリティが全くありません。

# 追記

Nightly RustにRLSをインストールして、例えば、Visual Studio Code(VSCode)の
拡張機能であるRust (rls)で使う際には、拡張機能の設定を変える必要があります。

```json
"rust-client.disableRustup": true
```

この設定により、[cargo-rls-install](https://crates.io/crates/cargo-rls-install)で新しくインストールした
「nightly-YYYY-MM-DD」というフォーマットのツールチェイン名を
正しく認識して、RLSを起動できるようになります。

</div></details>