2016-10-10 40 views
1

我與一個管理大量非常小的應用程序(~100 Portlet)的小團隊一起工作。每個portlet都有自己的git存儲庫。在我今天正在審查的一些代碼中,有人做了一個小小的編輯,然後將他們的pom.xml版本從1.88-SNAPSHOT更新爲1.89-SNAPSHOT。我添加了一條評論,詢問這是否真的是我們想要發佈的版本,但我並不真正瞭解這樣做的負面影響。總是使用Maven快照的後果是什麼?

爲什麼不這樣做?我知道快照不應該是發佈,但爲什麼不呢?僅使用快照有什麼後果?我知道maven不會將快照緩存爲非快照,因此它可能會每次都下載這個構件,但讓我們假裝緩存並不重要。從發佈管理的角度來看,爲什麼每次都使用SNAPSHOT版本,而只是將這個數字碰到一個不好的主意?

UPDATE: 每一場戰爭的文件,這些項目的結果將永遠可以在我們的團隊之外的Maven的回購,因此沒有下游用戶。

+1

它會使用更像發佈版本的快照,但沒有好處...快照是開發版本,可能隨時破壞和發展。另請參閱http://stackoverflow.com/questions/5901378/what-exactly-is-a-maven-snapshot-and-why-do-we-need-it。那裏的答案正在討論這個問題。 – Tunaki

+0

有什麼好處?除了緩存嗎?我的問題不是概念上的SNAPSHOTS。我理解預期的目的。我的問題是,不使用快照發布的實際好處是什麼,特別是內部部署的戰爭永遠不會在公共的Maven回購協議中實現? – xdhmoore

+0

由於SNAPSHOT旨在用於開發中的工件。它們不打算用作「發佈」版本。請注意,你可以讓它工作一些,但是每個知道Maven進入你的項目的開發人員都不會理解這件事,那樣不好...... – Tunaki

回答

2

的主要原因是不想做,這是整個Maven的生態系統依賴於一個快照版本是什麼具體的定義。這個定義不是你在你的問題中設置的定義:它只能代表當前處於活躍開發中的版本,並不是一個穩定的版本。其結果是,很多周圍的Maven構建的工具假定這個定義默認爲:

  1. maven-release-plugin不會讓你準備用快照版本發佈的版本釋放。所以你需要在你的版本控制上手工標記,或者製作你自己的腳本。這也意味着這些庫的用戶將無法使用默認配置的插件,他們需要設置allowTimestampedSnapshots
  2. 可用於自動更新到最新版本,版本將無法正常工作爲好,這樣您的用戶將不能夠使用它沒有配置疼痛versions-maven-plugin
  3. 存儲庫管理器像Artifactory或Nexus一樣,內置了託管快照依賴性和發佈依賴性的存儲庫的明顯區別。例如,如果您使用共享的Nexus全公司範圍內,它可以被配置to purge old snapshots所以這將打破你的東西......想象一下,有人取決於1.88-SNAPSHOT並完全去除:你要回去的時間和重新部署,直到下一次刪除...此外,某些Artifactory內部存儲庫可以配置任何快照,因此您將無法在此處進行部署;用戶將被迫再次添加更多的存儲庫配置,以指向那些允許創建快照的用戶,他們可能不想這樣做。
  4. Maven是關於配置之前的約定,這意味着所有Maven項目都應該嘗試共享相同的語義(目錄佈局,版本控制...)。能夠訪問您的項目的新開發人員會感到困惑,並且會耗費時間去理解爲什麼您的項目按照原來的方式進行構建。

最後,這樣做只會給用戶帶來更多的痛苦,並不會爲您簡化單一的事情。也許,你可以把有些工作,但是當事情是要打破(因爲公司政策,或其他一些未來的變化),不採取行動感到驚訝......

0

Tunaki給了很多合理的點,爲什麼你打破Maven最佳實踐,我完全支持這一觀點。但是,即使你不關心「其他公司的公約」,是有原因:

  1. 如果你沒有做CI(並考慮每建設成爲潛在的版本),你需要的版本來區分哪些應該是高效的,而那些只是爲了測試。如果一切都是SNAPSHOT,這很難做到。

  2. 如果有人(意外)部署了第二個1.88-SNAPSHOT,它將是新的1.88-SNAPSHOT,隱藏舊的(可以通過具體的時間戳獲得,但這很麻煩)。發行版本不能部署兩次。