ふと拡張一覧を眺めていると、このRust拡張は更新を停止したのでrust-analyzerに移ってね、みたいな表示が出ていて、移行してみたら結構大変だった。
要点
- rust-src がない: 最近のrustだと場所が変わっているのでsynbolic link で対応した
- VSCode で開くとWSLごと死ぬ: workspace にした
rust-src がない
ここに書いてあるのとまったく同じだったので、その通りにやって対応。
VSCode で開くとWSLごと死ぬ
ディレクトリ構成がまずくて、最初のスキャンが終わらなくて、リソース使い過ぎでWSLごと応答がなくなり、やむなくkill みたいなことが発生した。
たぶん、ルートディレクトリから再帰的に rust check
しているのだと思う。
変更前はこれで、生成物も子ディレクトリ内に作られる。細かいパッケージがたくさんある、みたいな構成。 これだと、10個ぐらいで死ぬ。 ちなみに、200個ぐらいあるので、当然死ぬ。
hello-rust/ |-abc001a/ |-src/main.rs |-Cargo.toml |-abc001b/ |-src/main.rs |-Cargo.toml |-abc001c/ |-src/main.rs |-Cargo.toml
変更後はこれで、workspace 形式にした。 生成物は、親ディレクトリに作られる。
hello-rust/ |-Cargo.toml |-abc001a/ |-src/main.rs |-Cargo.toml |-abc001b/ |-src/main.rs |-Cargo.toml |-abc001c/ |-src/main.rs |-Cargo.toml
親ディレクトリの Cargo.toml
には、workspace の設定を書く。
[workspace] members = [ "abc001a", "abc001b", "abc001c", ]
作業としては、
- 子ディレクトリの
target/
、Cargo.lock
を削除 - 子ディレクトリの
Cargo.lock
のpackage.name
を一意になるように書き換え(全部 hello にしてたので、ディレクトリ名と同じにした) - 親ディレクトリの
Cargo.toml
に作って、members
に子ディレクトリの名前を書く cargo check --quiet --workspace --all-targets
という手順になる。
Rubyであれこれ操作するスクリプトを書いたが、TOML の dump 形式に不満があったので、package.name
の書き換えは fd
と sd
でやった。
fd --max-depth 1 --type d -E target -x sd -s hello {/} {}/Cargo.toml
CLI作成にThor、TOML は toml-rb を使った
最初、Thor ではなく Rake でやろうとしたが、コマンドライン引数を使うのに難があり、 Rake と Thor を同じ文脈で紹介している記事が結構あったので、Thor にした。 コマンドライン引数を使うのならタスクランナーではなくてCLIだな、とか思ったし。 依存関係とかも別に気にしてないので。
めでたしめでたし