Gradle:基于条件控制向Nexus Maven仓库发布包
我有一个用于构建JAR包并发布至Nexus Maven仓库的build.gradle配置,内容如下:
publishing { publications { maven(MavenPublication) { artifact shadowJar } } repositories { maven { credentials { username nexusUsername password nexusPassword } if (IsSnapshot.toBoolean()) url "${nexusUrl}/repository/maven-snapshots/" else url "${nexusUrl}/repository/maven-releases/" } } }
当前这个配置可以根据IsSnapshot变量的值,把JAR包发布到对应的快照或正式仓库。现在我新增了DoPublish变量,希望仅当该变量值为true时才执行Nexus仓库的发布操作,否则不发布。我目前考虑的方案是在不发布时把url设为空字符串,但想知道有没有更优的实现方式?
附当前Gradle任务输出:
Publishing tasks
generatePomFileFor{module1}Publication - 为发布'module1'生成Maven POM文件。
generatePomFileFor{module2}Publication - 为发布'module2'生成Maven POM文件。
generatePomFileForMavenPublication - 为发布'maven'生成Maven POM文件。
publish - 发布本项目生成的所有发布产物。
publish{module1}PublicationToMavenLocal - 将Maven发布'module1'发布至本地Maven仓库。
publish{module1}PublicationToMavenRepository - 将Maven发布'module1'发布至Maven仓库'maven'。
publish{module2}PublicationToMavenLocal - 将Maven发布'module2'发布至本地Maven仓库。
publish{module2}PublicationToMavenRepository - 将Maven发布'module2'发布至Maven仓库'maven'。
publishMavenPublicationToMavenLocal - 将Maven发布'maven'发布至本地Maven仓库。
publishMavenPublicationToMavenRepository - 将Maven发布'maven'发布至Maven仓库'maven'。
publishToMavenLocal - 将本项目所有Maven发布产物发布至本地缓存。
把url设为空字符串的方式可能会引发Gradle配置层面的警告或者潜在问题,我推荐以下几种更优雅的实现方式:
方案1:条件性添加Nexus仓库
只在DoPublish为true时才配置Nexus仓库,这样当不需要发布时,整个Nexus仓库配置都不会加载,从根源上避免发布任务的执行:
publishing { publications { maven(MavenPublication) { artifact shadowJar } } repositories { // 仅当DoPublish为true时才添加Nexus仓库 if (DoPublish.toBoolean()) { maven { credentials { username nexusUsername password nexusPassword } url = IsSnapshot.toBoolean() ? "${nexusUrl}/repository/maven-snapshots/" : "${nexusUrl}/repository/maven-releases/" } } // 保留本地仓库发布(如果需要的话) mavenLocal() } }
这种方式的好处是:当DoPublish为false时,Gradle不会创建任何指向Nexus的发布任务,完全避免了误发布的可能,同时本地发布任务不受影响。
方案2:禁用Nexus相关的发布任务
如果需要保留仓库配置但不执行发布,可以通过任务的enabled属性来控制相关发布任务的启用状态:
publishing { // 原有的publications和repositories配置不变 publications { maven(MavenPublication) { artifact shadowJar } } repositories { maven { credentials { username nexusUsername password nexusPassword } url = IsSnapshot.toBoolean() ? "${nexusUrl}/repository/maven-snapshots/" : "${nexusUrl}/repository/maven-releases/" } mavenLocal() } } // 配置所有Nexus发布任务的启用状态 tasks.withType(PublishToMavenRepository) { enabled = DoPublish.toBoolean() }
这种方式适合需要保留仓库配置(比如生成POM文件)但不想实际发布到Nexus的场景,它会把所有PublishToMavenRepository类型的任务(也就是发布到远程仓库的任务)设为禁用,而本地发布和POM生成任务依然可以正常执行。
方案3:条件性执行publish任务
如果你只是想在调用publish任务时才判断是否执行,可以通过任务的onlyIf规则来控制,但前两种方案更直接:
tasks.named('publish') { onlyIf { DoPublish.toBoolean() } }
注意:这种方式仅限制publish主任务的执行,单独调用某个具体的Nexus发布任务(比如publishMavenPublicationToMavenRepository)时,这个限制不会生效,所以前两种方案的可靠性更高。
内容的提问来源于stack exchange,提问作者Krupa

