GitHub Actionsでactions-rs/cargo
を使ってcargoを実行したときに、working-directory
の変更が反映されない問題の原因と対処法をまとめます。
はじめに
GitHub Actionsにてactions-rs/cargoを使ってcargoを実行したときに、working-directory
の変更が反映されない、という問題に遭遇しました。
例えばrootディレクトリでなくサブディレクトリでcargo init
した場合(Cargo.toml
がrootではなくサブディレクトリにある場合)、GitHub Actionsでcargoコマンドを実行するときもそのサブディレクトリ内でcargoコマンドを実行したくなります:
# Actionsでcargo checkをサブディレクトリで実行させたい時のコード例 - name: Run cargo check uses: actions-rs/cargo@v1 with: command: check working-directory: <SUBDIRECTORY>
しかし、上記コードのようにworking-directory
を適用させても、actions-rs/cargo
が実行するディレクトリの場所は変更が反映されず、下記のようなエラーが出ます:
/home/runner/.cargo/bin/cargo check error: could not find `Cargo.toml` in `/home/runner/work/<ROOTDIRECTORY>/<SUBDIRECTORY>` or any parent directory Error: The process '/home/runner/.cargo/bin/cargo' failed with exit code 101
この問題の原因と対処法を整理します。
actions-rs/cargo実行時のworking directoryが変更できない問題への対処法
原因
working-directory
はrun
に対して適用されるものであり、actionsに反映させるにはactions側での対応が必要。actions-rs/cargo
はworking-directory
に対応していない。
まず、Actionsで定義できるworking-directory
は、runで実行されるコマンドに対して適用されるものであり、それぞれのactionsへの適用は自明ではありません。
そこで今回利用しているactions-rs/cargo
ですが、working-directory
は対応していません。
この問題を解決するプルリクは作成されていますが、メンテナーがコメントしている通り、mergeされることはなさそうです。
Add working-directory by MarcoPolo · Pull Request #59 · actions-rs/cargo · GitHub
よって現状、actions-rs/cargo
を使った場合はworking-directory
が反映されない、ということになります。
対処法
以下の2つが思い浮かびます。
--manifest-path
を指定する- cargoを直接実行する (
actions-rs/cargo
を使わない)
--manifest-pathを指定する
cargoのオプション--manifest-path
を指定することで、working directoryを変更せずともCargo.toml
の位置を指定することができます。
# --manifest-path を指定してcargo checkを実行するコード例 - name: Run cargo check uses: actions-rs/cargo@v1 with: command: check args: --manifest-path <SUBDIRECTORY>/Cargo.toml
これで問題なく解決する場合は、一番シンプルな対処法と言えるでしょう。
しかし、例えば.cargo/config
を指定している場合などは、ちゃんとcargo実行時のディレクトリを変更しないと設定が反映されないので注意が必要です。
cargoを直接実行する (actions-rs/cargo
を使わない)
上記の--manifest-path
を指定するやり方が使えない場合は、actions-rs/cargo
を使うことを諦めてcargo
を直接実行してしまう手もあります。
# cargoを直接実行するコード例 - name: Run cargo check working-directory: <SUBDIRECTORY> run: | cargo check
しかしこのやり方を採用すると、もちろん以下のようなactions-rs/cargoの恩恵は受けられなくなります。
use-cross
を利用したクロスインストールcargo
自身が出力するWarningとErrorをGitHub UIに表示する
それを受け入れられない場合は、もう他のactionを使う(あるいは自分で作る)しかないように思います。 幸いactions-rs/cargoからForkされたものもプルリクの議論の中で話題に上がっているので、試されると良いかもしれません。
Add working-directory by MarcoPolo · Pull Request #59 · actions-rs/cargo · GitHub
おわりに
以上、GitHub Actionsでcargo実行時のworking directoryが変更できない問題への対処法を整理しました。
どれも歯切れの悪い打ち手しかなく、少しモヤモヤします。
他に良い対処があったらぜひご教示ください。
[関連記事]
参考
Support changing working directory · Issue #6 · actions-rs/cargo · GitHub
Add working-directory by MarcoPolo · Pull Request #59 · actions-rs/cargo · GitHub
GitHub - actions-rs/cargo: 📦 GitHub Action for Rust `cargo` command
Workflow syntax for GitHub Actions - GitHub Docs
rust - How to specify the path to a Cargo.toml - Stack Overflow