2016-10-10 38 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,隐藏旧的(可以通过具体的时间戳获得,但这很麻烦)。发行版本不能部署两次。