rust: cargo の workspace
自分で作っている Rust のプロジェクトがあり、その 2つを一緒にしたプロジェクトを作ろうと思った。
どちらも本体は lib にあるので cargo add すればよいと思っていたが、
まだ改造が必要になるし、元々作っているのはそのままにして別系統にした方がよいと考えて cargo の workspace を使ってみることにした。
cargo プロジェクトの中に cargo プロジェクトがあるだけ?
ざっとした感想だが、ディレクトリを作ってその中に 2つの Rust プロジェクトをまるまるコピーし(.git は消す)、
同じ高さに Cargo.toml を置いてちょこちょこ書くと、それだけで特にメリットは無さそうだが cargo workspace になりそう。
こちらを見ていたけど、出てくる名前が add や adder で、 cargo add はここでは使っていないけどコマンドとしてはあるので頭の中がゴチャゴチャしてきた。
もうちょっと関係ない名前にしてくれれば良かったのに。
やる前はワークスペースの直下にある Cargo.toml がメインプログラムになるのかと思っていたが、予想が外れた。
ワークスペースのメンバーはこれこれで、でもデフォルトではこれこれしか使わない、みたいなことを書くだけだった。
各 cargo プロジェクトの中に Cargo.lock はない方が良い?
各 cargo プロジェクトの中はそれまでとあまり変わらない。
使われる Cargo.lock はトップにある方で
各プロジェクトにある Cargo.lock はなんだかよくわからない。
しかし vscode というか rust-analyzer だと思うのだが同じディレクトリにある Cargo.lock を見に行くのか
dependencies に追加しているクレートのバージョンを最新にしてもずっと × マークがついていた。
さんざん update だとかなんだとかやったがファイル削除したら直った。
トップディレクトリに src/ など置いてもダメそう
トップディレクトリに src/main.rs を置いて Cargo.toml の member に "." としてみたが認識されなかった。
されなくてもよいのだけど、もしかしたらされるかなー、と思っただけだ。
直接 workspace.dependencies に add するオプションはなさそう
昔の cargo にはそういうオプションがあったらしいが、不安定だったので削除されたらしい。
ChatGPT氏が言っていただけなので本当かどうかは知らん。少なくとも今(cargo 1.90.0)はない。
が、最初は ChatGPT が「--workspace オプションがあります!」と言ってきたのでね。。。
cargo v1.90.0 まで指定すればさすがに違うことはいわないだろうと思ったのだが、私の認識が甘かった。
フォローしておくと、v1.90.0 と指定したのでリリースノートにちょうど載っていた publish --workspace を挙げたのだろう。
公式ドキュメントが常に最新かどうかも判断できないだろうから信用せずに挙げなかっただけかもしれない。
プロジェクトの中に new すると .git を消し忘れる
git のプロジェクト運用はひとそれぞれだが、workspace の中で cargo new だけでプロジェクトを代入すると .git もその中に作られてしまって嫌かもしれない。
そういうときは cargo new <プロジェクト名> --vcs none とバージョン管理しないことを告げるとよい。
自動で Cargo.toml の [workspace].members に追加される。