loloicci.dev

cargo dependency: version のみでは main branch 以外にある tag を指定できない

Created at 2021-04-10, Last Modified at 2021-04-12

[dependency]
package = { git = "...", version = "0.2.0" }

で version を指して依存クレートを指定する場合、version tag のついた commit は main branch 中になくてはならないらしい。(2021/04/10 現在)

また、main branch 以外にある tag を指定する方法についても記述する。

現象例

main branch にない version が指定できないことと、その時のエラーを見ていく。

https://github.com/loloicci/cargo-single-package を依存クレートとして使用する。このクレートは

また、このクレートを使用するクレートの名前を cargo とする。

[dependency]
cargo-single-package = { git = "https://github.com/loloicci/cargo-single-package", version = "0.2.0" }

cargo check を実行。

$ cargo check
    Updating git repository `https://github.com/loloicci/cargo-single-package.git`
error: failed to select a version for the requirement `cargo-single-package = "^0.2.0"` 
  candidate versions found which didn't match: 0.1.0
  location searched: Git repository https://github.com/loloicci/cargo-single-package.git
required by package `cargo v0.1.0 (/Users/loloiccl/Work/rust/cargo)`

エラーメッセージは stable, nightly ともに同じ。

ワークスペース にいくつかクレートが含まれていてそのうちひとつに依存して……」とかをやりだすと、version によってエラーメッセージが変わってくるようだが、ここでは省略。 (今回の個人的ハマりポイントはここだった)

解決策

main branch に存在していない tag を指定する方法もしっかり存在している。

version と branch を併記する

version tag の含まれている branch 指定してやると、しっかりと tag を探してきてくれる。
branch での指定は branch の head の commit hash を rev として指定した時の挙動と同様らしい。 そのため、以下の方法では version 0.2.0 は指定できても version 0.2.0-alpha は指定できない。

[dependency]
cargo-single-package = { git = "https://github.com/loloicci/cargo-single-package", version = "0.2.0", branch = "prerelease" }

で依存解決できる。
素直に tag を直接指定しよう。

tag を直接指定する

実は cargo は tag を直接指定することもできる。

[dependency]
cargo-single-package = { git = "https://github.com/loloicci/cargo-single-package", tag = "v0.2.0" }

同様に rev で直接 commit hash を指定する方法 , branch (version を指定しない場合は branch の head を使用) も使用できる。

参考

https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html#specifying-dependencies-from-git-repositories

Report Issue Via