😽

WSL2で作るRustのWindows開発環境: Rustが征く(1)

2021/07/26に公開

VSCode, Jetbrains CLion, IDEA対応

関連記事:
WSL2で作るWindows開発環境: Rustが征く(1)

------------------- ↓ 前書はここから ↓-------------------

Qiita時代に

scoopで作るRustのWindows開発環境

という記事を書いた。
このときはWindows上にscoopを入れてRustを実行できるようにしたが、
あれからWSLも進化したのでそちらの環境を作ることにする。

といってもLinux上で環境作るのは簡単。
問題は悪名高いcrates.io接続が遅すぎるってこと。
それも解決していこう。

IDE設定は後書きの一番最後に記載した。
インストール側の方が重要なので

ヾ(・ω<)ノ" 三三三● ⅱⅲ コロコロ♪


------------------- ↓ 本題はここから ↓-------------------

WSLをインストール

WSL2がインストールされているのが前提。
(Dockerでもいいけどそれは別の機会に)
OSは何でも良いが、
ここではUbuntuを使っているものとする。

令和3年8月4日追記
コマンド一発でインストールできるパッチが配布されたそうだ。

https://forest.watch.impress.co.jp/docs/news/1342078.html

KB5004296をインストールして、
以下のコマンドでインストール

wsl --install

build-essentialをインストール

sudo apt install build-essential

rustのインストール

aptやbrewを使うって手もあったが、
開発環境はユーザーベースにしておきたいので、
一般ユーザーでインストールする。

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
echo 'export PATH=$HOME/.cargo/bin:$PATH' | tee -a .bashrc
source .bashrc
rustup --version
  rustup 1.24.3 (ce5817a94 2021-05-31) 
cargo --version
  cargo 1.53.0 (4369396ce 2021-04-27)

(^_^; bashの構文もう忘れた・・・

各種コンポーネントをも併せてインストールしておく

rustup target add wasm32-unknown-unknown
rustup component add rustfmt rust-analysis rust-src

hello world

それではHelloしてみよう。

cargo new hello
     Created binary (application) `hello` package
cd hello
cargo build
   Compiling hello v0.1.0 (/home/dozo/rust/hello)
    Finished dev [unoptimized + debuginfo] target(s) in 1.60s

実行

./target/debug/hello
 Hello, world!

(・∀・) 簡単ですね!


------------------- ↓ 後書はここから ↓-------------------

cargo-editをインストール

Cargo.tomlファイルをいじるの面倒なので、
その辺をざっくり扱ってくれるcargo-editを入れておく。

cargo install cargo-edit

(インストールファイル数とインストール時間に度肝抜かれるなよ)

cargo.ioが遅い問題を根本解決する

上記でcrates.ioが遅いって言う話をしたが、
接続が遅いのもあるが、
リポジトリ更新も遅いというのがある。
それらを解決する方法はないことはない

パブリックDNSを使用する

wslのresolv.confは自動生成で、
適当なローカルIPが設定されるが、
これが接続の足かせになっている。
そこで、GoogleやCloudflareが用意しているパブリックDNSを使用する

name ip
Google 8.8.8.8
Cloudflare 1.1.1.1
OpenDNS 208.67.222.222 and 208.67.220.220

resolv.confの手動設置

printf "[network]\ngenerateResolvConf = false" | sudo tee -a /etc/wsl.conf

wslを再起動

powershell
exit
wsl -t [ditro]
wsl -d [ditro]

resolv.confを再設置

printf "nameserver 1.1.1.1" | sudo tee /etc/resolv.conf

DISPLAY値再設定

resolv.confをpublic DNSにすると、
wslgやx11などの仕様に支障を来す。
その際、以下のコマンドで代用する

export DISPLAY=$(ip route | awk '/^default/{print $3; exit}'):0

参照: How to set up working X11 forwarding on WSL2

リポジトリ更新データを設定する

上記設定で十分実用的だが、
さらにローカルに設置する方法もある。
(ただし、動作が安定しないことも)
都度ダウンロードする更新情報をローカルにキャッシュする
更新情報リポジトリをbare cloneしてローカルに保存する

cd ~/.cargo/registry/index
git clone --bare https://github.com/rust-lang/crates.io-index.git

設定ファイルにローカルリポジトリを登録しておく。
cargoコマンド実行時にfetchが走るように設定を追加しておく

~/.cargo/config
[http]
timeout = 10

[net]
git-fetch-with-cli = true

[source.crates-io]
registry = "https://github.com/rust-lang/crates.io-index"
replace-with = 'crates-local'

[source.crates-local]
registry = "file:///home/dozo/.cargo/registry/index/crates.io-index.git"

cargo install cargo-addを計測してみると

状態 時間
設定前 31秒
設定後 20秒

(´▽`) サラマンダーよりはやーい

バイナリリポジトリを近場に変更する

チャイナにあるいくつかの大学で、
crates.ioのミラーサーバを立てているところがある。
リポジトリとの物理的な距離を近づけることで回避するわけだ。
これについてはリンクだけ張っておく。

https://lug.ustc.edu.cn/wiki/mirrors/help/rust-crates/

チャイナリスクが伴うので自己責任で
求むJPサーバー

設定状態を確認する

現状設定状態を確認する方法がないが、
nightlyのtoolchainであれば可能らしい。

rustup toolchain install nightly
cargo +nightly -Z unstable-options config get
  net.git-fetch-with-cli = true
  source.crates-io.registry = "https://github.com/rust-lang/crates.io-index"
  source.crates-io.replace-with = "crates-local"
  source.crates-local.registry = "file:///home/dozo/.cargo/registry/index/crates.io-index.git"
  # The following environment variables may affect the loaded values.
  # CARGO_HOME=/home/dozo/.cargo

(^_^;) nighly外してくれないかなぁ

VSCodeの設定

VSCodeは特別な設定は必要ない。
拡張モジュールに[Remote Development]、[Rust]と[rust-analyzer]をインストール。
[View]-[Command Pallette]より[Remote WSL]コマンドで、
Linux側のディレクトリを指定する。

例: \\wsl$\Ubuntu\home\dozo\repo

以下を参考のこと
Windows Subsystem for Linux で Visual Studio Code の使用を開始する
(VSCodeのRemoteWSLの仕組みは凄い)

Jetbrains Clion, IDEAの設定

CLionやWebStorm, IDEAでRustプラグインをインストールすれば、
Rust開発の各種サポートが可能だが、
WSLでのコンパイラ(?)実行は通常できない。

ただ、nightlyビルドのみだが、
WSLサポートが可能のようだ。
(そのうち正式対応すると思う)

NightlyビルドのRustプラグインをインストールする

以下のサイトにてNightlyビルドのプラグインをインストールする。
(リポジトリはRustだけでいい)

https://plugins.jetbrains.com/plugin/8182-rust/docs/rust-quick-start.html#install-nightly

WSL対応を有効にする

[Help]-[Find Action]を押下し[Experimental Feature]で検索

以下の3つにチェックを入れる。

  • org.rust.wsl
  • org.rust.macros.proc
  • org.rust.resolve.new.engine

[Language & Framework] - [Rust]の[Toolchain Location]で
Wsl上のcargoパスリストが表示されていれば成功

選択するとバージョン番号が表示されて、
プラグイン上で使用できる

Discussion