金魚亭日常

読書,ガジェット,競技プログラミング

rust-analyzer に移行した

ふと拡張一覧を眺めていると、このRust拡張は更新を停止したのでrust-analyzerに移ってね、みたいな表示が出ていて、移行してみたら結構大変だった。

要点

  • rust-src がない: 最近のrustだと場所が変わっているのでsynbolic link で対応した
  • VSCode で開くとWSLごと死ぬ: workspace にした

rust-src がない

ここに書いてあるのとまったく同じだったので、その通りにやって対応。

zenn.dev

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.lockpackage.name を一意になるように書き換え(全部 hello にしてたので、ディレクトリ名と同じにした)
  • ディレクトリの Cargo.toml に作って、members に子ディレクトリの名前を書く
  • cargo check --quiet --workspace --all-targets

という手順になる。

Rubyであれこれ操作するスクリプトを書いたが、TOML の dump 形式に不満があったので、package.name の書き換えは fdsd でやった。

 fd --max-depth 1 --type d -E target -x sd -s hello {/} {}/Cargo.toml

CLI作成にThor、TOML は toml-rb を使った

github.com

最初、Thor ではなく Rake でやろうとしたが、コマンドライン引数を使うのに難があり、 Rake と Thor を同じ文脈で紹介している記事が結構あったので、Thor にした。 コマンドライン引数を使うのならタスクランナーではなくてCLIだな、とか思ったし。 依存関係とかも別に気にしてないので。

めでたしめでたし