2016-07-25 51 views
12

我有一個項目具有對iron>= 0.3, <= 0.4的依賴關係(cookie工具)。合併貨物依賴關係

我的項目依賴鐵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>)。我沒有看起來超級難過,但這種行爲似乎沒有在任何明顯的地方描述。我的第二個問題是:這是合併依賴關係的有效方法嗎?有什麼地方可以找到關於這方面的更多信息嗎?


和步驟重現:

  1. 創建一個新項目:cargo new --bin ironapp; cd ironapp
  2. 創建cookie依賴關係:cargo new cookie_util
  3. cookie_util/Cargo.toml添加一個依賴項:iron = ">= 0.3, <= 0.4"
  4. Cargo.toml中添加兩個依賴項:iron = "0.3.0"cookie_util = { path = "cookie_util"}
  5. cargo build。確認Cargo.lock需要兩種鐵質版本。
  6. 運行cargo update -p cookie_util任何地方在1和4(或更多)次之間。最終它將消除對iron 0.4.0的依賴。

我剛剛在rustc-1.10.0/cargo-0.11.0上測試了這個。我確信targetCargo.lock都沒有在第1步的開始。

+2

這可能值得創建一個問題[這裏](https://github.com/rust-lang/cargo/issues)。 – squiguy

+1

我第二次來自@squiguy的評論;創建一個問題。但是,請確保您在提交問題時提供[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