2014-01-30 35 views
6

可以說我創建了我的庫foo從版本1.0.01.0.1的二進制兼容更新。庫foo通過Maven發佈。次要版本更新可用於次要更新傳遞依賴項嗎?

我可以使用這個次要版本更新來同時衝擊foo的依賴關係的次要版本嗎?例如,版本1.0.0使用scalaVersion := "2.10.1"。我可以在foo 1.0.1中將其更改爲scalaVersion := "2.10.3",還是會造成麻煩?

假設我用foo在另一個項目爲

"mygroup" %% "foo" % "1.0.+" 
+0

您應該管理父pom.xml中的版本號。這樣更新後的版本被填充到所有子模塊。那是你正在尋找的東西嗎? –

+0

你怎麼知道Scala 2.10.3不會破壞你的代碼?還是一個取決於你的代碼的項目? – HDave

+0

@ chris.tian沒有父母。斯卡拉圖書館是獨立於我的圖書館。 –

回答

6

有涉及到幾個方面的考慮,但通常是的,你可以改變依賴的版本,如果他們是二進制兼容。 Scala團隊希望2.10.x版本能夠兼容二進制文件。您可以在Scala 2.10.1上編譯並在運行時使用2.10.3。

只要您使用兩種存在的方法和類型,通常可以對Scala庫做相反的處理。雖然大多數圖書館都不關心這個方向。其他有關二進制兼容性的注意事項:

  • 不同的圖書館對什麼版本的顛簸有不同的策略。
  • 庫可能有也可能沒有自動檢查二進制兼容性。
  • 自動化像MiMa(由Scala使用)不能捕捉各種不兼容性。例如,MiMa只捕捉「語法」不兼容(在運行時拋出LinkageError)。
  • 二進制兼容性並不意味着源代碼兼容性。

但是,通常不建議使用動態修訂版本,如「1.0。+」。它們使複製建設變得更困難,並影響分辨率速度。

+0

我很驚訝,你建議不要使用'+'版本。我很喜歡他們。它允許我發佈一個錯誤修復版本,任何新項目都可以自動利用它們。與我的問題有關的種類:如果我的項目的兩個依賴關係A和B依賴於兩個不同次要版本中的C, '1.0.0'和'1.0.1',我想我最終在'lib_managed'中有'1.0.0'和'1.0.1',或者會自動回退到'1.0.1'?這對我來說是使用'1.0。+'的動機。 –

+1

關於lib_managed,請參閱http://stackoverflow.com/a/21368201。常春藤將解決兩個不同的版本。 Ivy的默認策略是使用最新版本,所以1.0.1會被選爲1.0.0以上。 –

+1

在動態修訂版中,它們使重複性更難。你可以做到,但它需要更多的工作,最終你不再使用動態修訂。請注意,它們不是由Gradle或Maven推薦的。 –

2

一般現代軟件如下semantic versioning

給定一個版本號MAJOR.MINOR.PATCH,遞增:

MAJOR version when you make incompatible API changes, 
MINOR version when you add functionality in a backwards-compatible manner, and 
PATCH version when you make backwards-compatible bug fixes. 

所以"2.10.3"是要與任何"2.10.x"版本兼容。

通常我們不應該關心.PATCH部分,除了影響我們代碼的bug被修復的情況。我想這是事實。