Gradle with maven-publish:如何自动转换并将目录中的非gradle jar发布到Artifactory

时间:2014-07-08 17:31:28

标签: dynamic gradle publish artifactory

作为从ant迁移到gradle的短期选项,我们只想在我们的ant构建的开始和结束时使用gradle,而不是从gradle中运行ant。

基本上我们想使用gradle来获取目录的依赖关系,然后运行ant build,将所有指定的jar放在一个目录中,然后使用gradle将该目录中的工件发布到Artifactory。

这意味着gradle实际上不会构建工件 - 它会在目录中找到它们,但是我们仍然会喜欢它们的版本化(因为它们会变成神器)

因此,我们希望使用Gradle动态版本并发布目录中的所有文件。

回顾gradle文档,看起来Gradle和artifactory-publish插件专注于“要发布的模块”的更多静态定义。我很难让Gradle正确发布目录中的动态文件数。

我已经尝试了以下(浓缩),但是在我的测试中它到目前为止无效(因为MavenPublication名称似乎需要静态文本) - 并且artifactory-publish位当前没有循环到正确的集合MavenPublications:

apply plugin: 'java'
apply plugin: 'maven-publish'
apply plugin: 'artifactory-publish'

version = new Version( 1, 0, System.env.BUILD_NUMBER )   // set by Jenkins

ext.filesToPublish=['foo.jar', 'bar.ear']

publishing {
   publications {
      def i=0;
      for ( s in filesToPublish ) {
         ++i
         def vname="artifact" + i;
         $vname(MavenPublication) {
            artifact s
            artifactId vname
         }
      }
   }
}

artifactory {
   contextUrl = 'http://.../artifactory'
   publish {
      repository {
         repoKey='...'
         username='...'
         password='...'
      }
      defaults {
         publications('artifact0')
         publications('artifact1')
         publications('artifact2')
      }
   }
   resolve {
      repository {
         repoKey='...'
      }
   }
}

我很感兴趣,如果有人想出一种方法可以将找到目录的所有文件动态发布到Artifactory。

有没有更好的方法,比如像Java插件那样定义组件的方法呢?

我也尝试过动态创建MavenPublication对象,但无法实现。这会是一个更好的方法吗?

谢谢!

1 个答案:

答案 0 :(得分:4)

编辑:通过额外的研究和对Groovy的更好理解,我能够完成以下任务 - 注意在变量扩展周围使用双引号 - " $ fbase"与之前相比:

apply plugin: 'java'
apply plugin: 'maven-publish'
apply plugin: 'artifactory-publish'

version = new Version( 1, 0, System.env.BUILD_NUMBER )   // set by Jenkins

ext.filesToPublish = []
ext.dir= new File("pub")
ext.dir.eachFile( groovy.io.FileType.FILES ) { file ->
   ext.filesToPublish << file
}

publishing {
   publications {
      for ( f in filesToPublish ) {
         def fbase=f.getName().split("\\.")[0]
         "$fbase"(MavenPublication) {
            artifact f
            artifactId fbase
         }
      }
   }
}


artifactory {
   contextUrl = 'http://.../artifactory'
   publish {
      repository {
         repoKey='...'
         username='...'
         password='...'
      }
      defaults {
         for ( f in filesToPublish ) {
           def fbase=f.getName().split("\\.")[0]
           publications( fbase )
         }
      }
   }
   resolve {
      repository {
         repoKey='...'
      }
   }
}