为什么LATEST是一个依赖管理反模式?

时间:2015-01-16 17:29:10

标签: 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'

    // The problem:
    compile 'org.ourcompany:widget-client:LATEST'
}

对此他说:“使用LATEST是一种依赖管理反模式,不要这样做。”我很想问“为什么?” em>“,但我没有。

我之所以这样做是因为widget-client JAR版本每月更改多次,并且尝试记住使用最新版本号更新我的Gradle版本变成了一场噩梦。更糟糕的是,我已经失去了很多时间调试和排除问题,因为我们没有最新的widget-client版本。所以这是我的修复。

在我使用LATEST推回并为我们游说之前,我想了解情况。也许建筑师是正确的,在这种情况下,我想知道为什么,更重要的是,解决方案是什么(所以我不需要更新我的Gradle每周建两次)。如果他不对,我想了解原因。

我的另一个想法是,或许可以将特定版本的widget-client标记为STABLE,然后我们可以随时提取最新的STABLE它的版本,其中或许LATEST更好,但也许不是......这样,至少,我们总是有一个稳定的客户版本并被视为功能齐全,经过充分测试,让我们远离(潜在的错误)前沿,但仍然给我一个STABLE标签,所以我不必继续更新特定版本的代码。

这真的归结为LATEST为什么不好。如果它因为它让你固定在流血的边缘(因而也就是错误),那么我认为STABLE解决方案是可行的方法,但我对这些东西知之甚少,以找出具体的解决方案。如果LATEST由于其他原因而不好,或者根本没有坏,那么我不知道该怎么做。想法?

1 个答案:

答案 0 :(得分:6)

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

事情变得更糟,如果这种依赖性依赖于其他库,这些库可能会改变它们的版本并且可能与你的库发生冲突。

事实上,当您使用LATEST时,您不会管理依赖项。