Gradle 为什么最新版本是依赖关系管理反模式?

Gradle 为什么最新版本是依赖关系管理反模式?,gradle,versioning,dependency-management,anti-patterns,Gradle,Versioning,Dependency Management,Anti Patterns,我最近在一次代码审查(针对我的代码)中,一位架构师在我的build.gradle文件中看到了以下内容: dependencies { compile 'org.apache.commons:commons-lang3:3.3.2' compile 'org.apache.httpcomponents:httpclient:4.3.2' compile 'com.fasterxml.jackson.core:jackson-annotations:2.3.0' /

我最近在一次代码审查(针对我的代码)中,一位架构师在我的
build.gradle
文件中看到了以下内容:

dependencies {
    compile 'org.apache.commons:commons-lang3:3.3.2'
    compile 'org.apache.httpcomponents:httpclient:4.3.2'
    compile 'com.fasterxml.jackson.core:jackson-annotations:2.3.0'

    // The problem:
    compile 'org.ourcompany:widget-client:LATEST'
}
对此,他说:“使用
LATEST
是一种依赖管理反模式,不要这样做。”我很想问“为什么?”,但我没有问

我这样做是因为
widget客户机
JAR版本一个月会更改多次,而要记住用最新版本号更新我的Gradle构建版本就成了一场噩梦。更糟糕的是,由于我们没有最新的
widget-client
版本,我已经浪费了很多时间调试和故障排除问题。这就是我的解决办法

在我使用
最新的
推回并游说我们之前,我希望得到充分的信息。也许架构师是正确的,在这种情况下,我想知道为什么,更重要的是,解决方案是什么(因此我不必每周更新两次Gradle构建)。如果他不正确,我想了解一些原因

我的另一个想法是,也许可以将
widget client
的某个特定版本标记为,比如说,
稳定的
,然后我们就可以一直使用它的最新
稳定的
版本,这可能比
最新的
好,但可能不是。。。这样,至少,我们总是有一个稳定的客户端版本,并且被认为是功能性的和经过良好测试的,这使我们远离(潜在的错误)前沿,但仍然给了我一个
稳定的
标签,所以我不必不断地将deps更新到特定的版本


实际上,这一切都归结于为什么最新的
不好。如果这是因为它让你停留在最前沿(并因此产生bug),那么我认为一个稳定的解决方案是可行的,但我对这方面的知识还不足以形成一个具体的解决方案。如果最新的
由于其他原因不好,或者根本不坏,那么我也不知道该怎么办。想法?

这很糟糕,因为它使构建不可复制。如果几天后使用相同的源运行相同的生成,结果可能会有所不同,因为使用了另一版本的依赖项

如果此依赖关系依赖于其他库,而这些库可能会更改其版本,并且可能与您的库发生冲突,则情况会变得更糟


因此,事实上,当您使用最新版本时,您不会管理依赖关系。

谢谢@Henry(+1)-因此这回答了为什么,但没有解决解决方案。我真的是被迫每周多次升级我的版本,还是有中间立场(比如我的
STABLE
解决方案)?再次感谢!稳定的变体并不能真正改变根本问题。假设您在本地测试您的源代码,并且一切正常。然后签入它,生成服务器再次编译它,结果版本被破坏,因为依赖关系在此期间发生了更改。最好的方法是在检查风险和好处之后,有意识地进行版本升级。永远不要害怕为了学习而问“为什么”。