Gradle中的“发布快照”和“发布版本”在持续集成中有何区别?

37
我正在学习Gradle,之前使用过Ant+Ivy和Maven。我正在努力理解使用Gradle发布软件的正确方式。我还需要在不必频繁发布独立工件的情况下持续集成我的项目。
在Ant + Ivy中,可以创建publishSnapshot和publishRelease目标。这两个目标可以使用不同的Ivy解析器来解析并发布到我的不同快照或发布仓库中。
在Maven中,我可以在distributionManagement部分中定义snapshotRepository或repository,以使Maven发布到我的不同快照或发布仓库中。
现在进入Gradle。我该如何实现相同的功能?我正在使用ivy样式的存储库。
感谢下面René的答案,我最终能够创建可行的解决方案。问题的关键在于我需要跨所有项目进行持续集成。为此,我认为使用版本号"latest.integration"声明依赖项是拉取我的库的最新版本的唯一方法,因此我需要使用ivy样式的存储库。实际上,在所有项目中持续集成我的软件的最新版本,还有其他方法可以拉取库。解决方案是像René下面列出的那样使用uploadArchives(请注意,您需要应用插件:apply plugin: 'maven'才能实现此功能)。确保您的存储库也是maven样式,并且在声明依赖关系时,您可以像这里所示使用动态版本号。在我的情况下,我在common.gradle中列出了全局版本号,在下游项目中,我使用version:version来引用全局版本变量。这样,系统中的每个构件都具有相同的版本。当发布时间到来时,我可以将其从1.0-SNAPSHOT更改为1.0,并按顺序构建每个构件。
2个回答

61

您可以在“上传”任务(例如uploadArchives任务)中配置快照发布仓库:

uploadArchives {  
    repositories {  
        mavenDeployer {  
            repository(url: 'http://myCompanyRepo.com:8081/releases') {  
                authentication(userName: 'admin', password: 'password');  
            }  
            snapshotRepository(url: 'http://myCompanyRepo.com:8081/snapshots') {
                authentication(userName: 'admin', password: 'password');  
            }  
        }  
    }  
}

对于以*-SNAPSHOT结尾的版本,使用snapshotRepository。否则,使用releases仓库。


抱歉,我应该澄清一下,我正在使用ivy风格的存储库。我会更新问题。 - dev
1
Nexus不支持ivy样式的存储库。最好使用Maven存储库格式,因为它被所有构建工具包括Maven、Gradle、Gant、sbt、Leiningen、Ivy等都支持。 - Manfred Moser
我似乎可以使用ivy设置将内容发布到Nexus?为了使用latest.integration,我需要以ivy格式发布。如果我切换到Nexus的maven仓库格式,我将不能使用此功能。 - dev
我通过使用动态版本号克服了最新的集成限制,这使我能够使用Maven仓库格式并实现了您上面的解决方案。我已更新问题并附上答案。 - dev
关于将ivy设置发布到Nexus的快速提示。它将解析库,但不会解析瞬态库。需要注意这一点。原因是它期望找到一个包含依赖项列表的库的pom文件,但实际上没有-只有ivy.xml文件。 - avanderw
再强调一下:Gradle会根据project.version是否以“-SNAPSHOT”结尾自动选择snapshotRespository而不是repository。这有点像魔法,但现在我很高兴我可以做我想做的事情。 - Sridhar Sarnobat

58

如果你想使用新的maven-publish插件,你可以使用if语句上传到不同的仓库:

apply plugin: 'maven-publish'

...

publishing {
    publications {
        mavenJava(MavenPublication) {
            from components.java
        }
    }
    repositories {
        maven {
            credentials {
                username "anonymous"
            }
            
            if(project.version.endsWith('-SNAPSHOT')) {
                url "http://example/artifactory/libs-snapshot-local"
            } else {
                url "http://example/artifactory/libs-release-local"
            }
        }
    }
}

参考资料:maven-publish和设置snapshotRepository和releaseRepository


2
那么相较于仅使用Maven插件,采用这种解决方案的优势是什么? - anon
嗨,如果您使用Maven分类器并生成档案,则需要使用maven-publish,因此此答案非常有帮助。谢谢。 - Arzhh
参考链接已失效。如何有条件地设置 project.version - Stealth Rabbi
@janosch的Maven插件现已被弃用。 - Peter S.
新的参考链接应该是 https://discuss.gradle.org/t/maven-publish-and-setting-snapshotrepository-and-releaserepository/5549。 - Warlock
谢谢@Warlock,我刚刚更新了链接。 - Paolo Fulgoni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接