🪄

cargo alias を使ってタスク登録したかった

に公開1

つまり私には合わなかったということです.


Cargo には alias を使って独自のコマンドを定義することができます[1].

これを使えば Cargo を npm-scripts のようにタスクランナーとして利用することができます. 正直 cargo clippy -- -D warnings ですらめんどくさいので, cargo lint ぐらい簡単に使いたいです. というか npm-scripts はそれくらい気軽に使ってますよね.

具体的には .cargo/config.toml をプロジェクトディレクトリに配置するか, $CARGO_HOME/config.toml を配置すればよいようです. 具体的には以下のように書きます.

.cargo/config.toml
[alias]
lint = ["clippy", "--", "-D", "warnings"]

これで cargo lint と打つだけで cargo clippy -- -D warnings が実行されます.

問題点

が, 私の場合はこれをタスクランナーとして使うことはできませんでした.

動的な変数の設定

この config.toml では動的な変数を設定したり, alias の中でシェルを使って動的な変数を設定することができません. 例えば TIMESTAMP=$(date +%s) cargo test のように実行することはできません. ちなみに私はコードカバレッジの計測のために llvm-cov を使っているのですが, 除外ファイルの設定に以下のような呪文詠唱が必要です. これもシェルの展開を使っているため alias では実行できません.

llvm-cov --lib --ignore-filename-regex `(grep -Ev '^\\s*(#|$$)' scripts/coverage_ignore.txt | sed 's#^#src/#; s#$$#.rs#' | paste -sd '|' -)`

Cargo.toml と分離している

そもそも config.toml はプロジェクトの設定ファイルである Cargo.toml とは別のファイルです. package.json を見ればプロジェクトでの操作がわかるというような利点がありません. .cargo/config.toml に隠れているので気づかない可能性があります.


ということで cargo alias を使ってタスクランナーとすることは諦めました. cargo alias で扱えるものだけ登録しても管理が複雑になるだけなので, 他のツールに寄せています. cargo alias はプロジェクトとして運用するというより, 個々人でシェルの alias のように使うのが良いのかもしれません.

タスクランナーとして使えるツールとしては cargo-make のようなものがあります. ただ, 私としては依存関係は可能な限り減らしたいです. ということで結局 make が最強になってしまいました.

脚注
  1. Configuration - The Cargo Book ↩︎

Discussion

futsuuufutsuuu

cargo xtask という方法がありますよ。
xtask という名前の package を workspace に追加して、run --package xtask -- を alias として設定しておくというものです。
数個のワンライナーのために用意するのは冗長ですが、Rust でタスクを書けるので動的な変数はもちろん使えますし、少し作りこめば cargo xtask --help でタスクの一覧を表示することもできます。
Cargo や rust-analyzer でも使われているということもあり、個人的にはおすすめです。