2017-07-14 59 views
1

我一直在Rust開發一個項目。前幾天我跑了cargo update,我的一大堆依賴被降級了,我一直無法弄清楚爲什麼。我創建了一個新的項目,並已發現,如果在Cargo.toml依賴只是爲什麼添加字節順序將貨物降級到8.0.0版本?

[dependencies] 
mysql = "*" 

它構建了最新mysql(11.3.0),因爲我期望的那樣。如果我添加

byteorder = "1" 

然後運行cargo clean/cargo updatemysql被降級到8.0.0。

任何幫助搞清楚爲什麼byteorder依賴正在使貨物降級mysql或如何阻止它這樣做,將不勝感激。

回答

1

如何從這樣

這是比較容易的部分停止:不使用通配符的版本。您的代碼與工作的機會幾乎爲曾經發布過的該工具箱的任何版本平均爲零。

爲什麼字節順序依賴性使得貨物降級MySQL的

這實際上是真的很難回答。採摘依賴is an NP-hard problem。由於大多數程序員並不在意等待那麼長時間,所以每個依賴管理者都有啓發式方法和首選項以及快捷方式。我不知道貨物算法的所有細微差別,所以大部分是受過教育的猜測或調查。

你已經告訴貨物「我不在乎使用哪個版本的mysql」說mysql = "*"。 Cargo現在可以自由使用任何想要的版本,這是一個非常靈活的要求。

在這種情況下,mysql 11.3.0 has chosen to require byteorder = "~1.0"。那不是允許字節順序1.1.0。依賴關係解析的某些方面看到了這一點,並且表示最好允許您的箱子擁有版本1.1.0的byteorder,即使這意味着需要將mysql降級到非衝突版本。重要的是8.0.0版是最後一個只需要字節順序0.5.3的版本。

如果你試圖迫使這兩個當前的版本中,你會看到這一點:

error: failed to select a version for `byteorder` (required by `mysql`): 
all possible versions conflict with previously selected versions of `byteorder` 
    version 1.1.0 in use by byteorder v1.1.0 
    possible versions to select: 1.0.0 

但是,你可以得到幾乎完全更新:

[dependencies] 
mysql = "11.3.0" 
byteorder = "1.0.0" 

我不能完全肯定爲什麼Cargo會允許你同時擁有版本1.1和0.5,但不是1.1和1.0,但我的猜測是啓發式是隻有一個給定箱子的語義主版本。

對貨運的未來增強可能會引入"public" and "private" dependencies的概念,這可能會改變分辨率算法以及使這種情況更好,因爲字節順序可能是mysql的內部依賴關係,您不需要匹配它。

+0

謝謝,那釘了它。事實上,如果我明確地在Cargo.toml中設置mysql版本而不將字節順序依賴關係更改爲1.0,那麼貨物更新就會坐下來旋轉CPU,因爲它試圖找到依賴衝突的解決方案。幾分鐘後我殺了它,所以我不知道它是否最終會放棄。 –

+0

@DanielHarding你的意思是'mysql =「11.3.0」byteorder =「1」'?我不能說這是一個錯誤或任何東西,但我鼓勵你報告任何需要那麼長時間的事情。我期望的一個啓發式就是在一段時間後停止搜索。 – Shepmaster

+0

現在我無法再現它:-(如果它再次出現,我可以製作一個可重複的測試用例,我一定會報告它。 –