2016-07-25 2 views
12

私は依存関係(クッキーユーティリティ)があり、依存関係のあるプロジェクトがiron>= 0.3, <= 0.4です。貨物依存の統合

私のプロジェクトは、鉄道0.3に依存しています(最新の鉄に更新されていないrouterミドルウェアを使用できます)。

私のプロジェクトをコンパイルしようとすると、cookieユーティリティは0.4バージョンの鉄をプルします。異なるバージョンの鉄が使用されているため、エラーが発生します。

しかし、私が行うことができます。

cargo update -p <cookie utility> 

(通常は)私が使用していたものと一致した鉄にそのパッケージの依存関係を変更し、鉄0.4に余分な依存関係を除去します。 (奇妙なことに、更新する前にそのコマンドを数回実行しなければならないことがあります。)

明らかに依存関係の依存バージョンを指定することはできません:Set specific version of the dependency of a project's dependency in Cargo.toml or Cargo.lock

貨物が私が鉄の単一のバージョンを使用したいと思うのであればいいですが、なぜそれができないのか理解しています。しかし、私はなぜcargo update -p <package>が実際に動作するのか混乱しています。パッケージの依存関係を更新することは直感的ではないようです。 (と私が欲しいのバージョンは、そのライブラリのサポートされるバージョンの範囲内にあるときのみの場合)どのように私は、依存関係の依存関係のバージョンを指定することができます。


私は私の最初の本当の問題があると思いますか?私は、上にリンクされた質問で提案された解決策は理想的ではないと思います。 Cargoがこれをうまくサポートできるようになると良いと思うので、ライブラリは機能が許す限り依存関係のバージョン範囲を開いたままにすることができます。

同時に私は自分の望むことをするような "トリック"を見つけました(cargo update -p <pkg>)。私は非常に見苦しくはありませんが、この動作は明白な場所に記述されていないようです。私の2番目の質問は、これは依存関係を合体させる有効な方法ですか?これについてもっと知ることができる場所はありますか?


そして再現手順:

  1. 新しいプロジェクトを作成します。cargo new --bin ironappを。 cd ironapp
  2. Cookieの依存関係を作成します。cargo new cookie_util
  3. cookie_util/Cargo.toml 1つの依存関係を追加してください:iron = ">= 0.3, <= 0.4"
  4. Cargo.tomlには、iron = "0.3.0"cookie_util = { path = "cookie_util"}の2つの依存関係を追加します。
  5. cargo buildCargo.lockに鉄の2つのバージョンが必要であることを確認してください。
  6. cargo update -p cookie_utilを1から4(またはそれ以上)の間で実行してください。最終的にiron 0.4.0への依存関係は削除されます。

これをrustc-1.10.0/cargo-0.11.0でテストしました。ステップ1の開始時にtargetCargo.lockが両方とも存在しないことを確認しました。

+2

これは[ここ](https://github.com/rust-lang/cargo/issues)の問題を作成する価値があります。 – squiguy

+1

@squiguyからのコメントが2番目です。問題を作成します。ただし、問題を提出する際に** [MCVE] **を提供するようにしてください。そしてここ。 – Shepmaster

+0

コメントありがとうございます。私は少し質問を明確にしようとしました –

答えて

5

cargo/issues/2064のコメントを読んで、私は、これらのタイプの依存性を解決するより頑強な方法は、--preciseフラグを使用することであることを認識しました。私の例では、

cargo update -p iron:0.4.0 --precise 0.3.0 

は不要な依存関係を取り除きます。これにはCargo.lockを調べ、依存関係が収束できる場所を手動で決定する必要がありますが、cargo update -p <pkg>を実行するよりはるかに優れており、最高のものを望むか​​手動でCargo.lockを編集する必要があります。

関連する問題