15

私のプロジェクト A は、ライブラリ C に依存するライブラリ B に依存しています。

ライブラリ B は依存バージョンを"*"(any) に設定するため、Cargo は C の最新バージョンをダウンロードします。

ライブラリ C の特定のバージョンを使用してライブラリ B をビルドするように Cargo に指示するにはどうすればよいですか?


私はを作ろうとしています。

現在のビルドは失敗していますが、Rust および Cargo パッケージ バージョンを含む、最後に成功したビルドを確認できます。

ビルドで使用される特定の Rust nightly をダウンロードし、Cargo.toml を編集して、iron の直接の依存関係をそのビルドで使用されるものに設定しました。

[dependencies]
hyper = "0.0.18"
typemap = "0.0.5"
url = "0.2.9"

rust-serializedurlおよびパッケージの依存関係である はtime、特定の Rust バージョンでコンパイルされない最新バージョンとしてダウンロードされます。

上記の Travis ビルドで使用したバージョンを使用した場合、コンパイルに成功するはずです。

4

2 に答える 2

7

手動編集

Iron をチェックアウトし、変更Cargo.tomlしてバージョンを指定できます (既に行ったように)。次に、プロセスを繰り返し、 をチェックアウトしurl、その を変更してから、Iron の でCargo.toml自分のバージョンの を使用していることを確認します。すすいで繰り返します。urlCargo.toml

パッチのオーバーライド

貨物のドキュメントから:

[patch]セクションをCargo.toml使用して、他のコピーとの依存関係をオーバーライドできます。[dependencies]構文は次のセクションに似ています。

[patch.crates-io]
foo = { git = 'https://github.com/example/foo' }
bar = { path = 'my/local/bar' }

ソースには、存在しないバージョンのクレートでパッチを適用できます。また、既存のクレートのバージョンでソースにパッチを適用することもできます。ソースに既に存在するクレート バージョンでソースにパッチが適用された場合、ソースの元のクレートは置き換えられます。

パスのオーバーライド

貨物のドキュメントから:

一時的にクレートで作業しているだけで、上記のセクションのCargo.tomlように変更する必要がない場合があります。このユースケースのために、Cargo はパスオーバーライド[patch]と呼ばれる、より制限されたバージョンのオーバーライドを提供します。

パスのオーバーライドは、.cargo/config.tomlの代わりに経由で指定されますCargo.toml.cargo/config.tomlあなたの中で、というキーを指定しますpaths

paths = ["/path/to/uuid"]

特定のバージョン

Rust バージョンで動作することがわかっている各依存関係のバージョン (または SHA ハッシュ) を単純に指定できる場合があります。Cargo は推移的な依存関係を解決し、すべての要件に適合するバージョンがあれば、以前のバージョンにロックできるはずです。

または、 を使用cargo update -p somecrate --precise major.minor.patchしてクレートの正確なバージョンを指定し、Cargo.lock.

これはすべての場合に機能するとは限りません。Rust は、1 つのバイナリにコンパイルされた同じライブラリの複数のバージョンを持つことができます。これは、すべてに適用されるバージョンを指定できる場所が 1 つもないことを意味します。

報奨金への対処

ジョンは次のように付け加えます

zstd に依存するクレートがあります。zstd は zstd-safe に依存します。zstd-safe は zstd-sys に依存します。私のクレートは、C ライブラリとして zstd もリンクする C++ バイナリにリンクされます。zstd C ライブラリと zstd-sys によって販売されている zstd のバージョンは、正確に一致する必要があります。そうしないと、リンク エラーが発生します。だから私はzstd-sysの正確なバージョンを固定したい

このケースは、上記の「特定のバージョン」の例に従うことができますが、zstd-syslinksキーを使用するため、クレート グラフ全体でそのクレートが1 つだけ存在する可能性があります。つまりzstd-sys、トップレベルの依存関係を追加して、競合するバージョンが導入された場合に Cargo が文句を言うことに安心できるということです:

[dependencies]
zstd = "0.9.0"
zstd-sys = "=1.6.1"

これを編集してバージョン 1.6.0 を指定すると、エラーが発生します。

error: failed to select a version for `zstd-sys`.
    ... required by package `zstd-safe v4.1.1+zstd.1.5.0`
    ... which is depended on by `zstd v0.9.0+zstd.1.5.0`
    ... which is depended on by `so v0.1.0 (/private/tmp/so)`
versions that meet the requirements `=1.6.1` are: 1.6.1+zstd.1.5.0

the package `zstd-sys` links to the native library `zstd`, but it conflicts with a previous package which links to `zstd` as well:
package `zstd-sys v1.6.0+zstd.1.5.0`
    ... which is depended on by `so v0.1.0 (/private/tmp/so)`
于 2015-01-04T20:43:11.773 に答える