2017-05-31 186 views
0

作为一家软件公司,我们被要求提供软件及其所有依赖项。依赖关系应该被发布到另一个artifactory。换句话说,我们希望从我们的工具中获取所有项目的依赖关系,并将它们发布到另一个工具中,以使客户端能够构建软件。Gradle - 将所有项目的依赖关系发布到其他Artifactory

有没有办法在Gradle中做到这一点?

回答

1

this gist

public class MavenArtifactCopyTask extends DefaultTask { 
    @Input 
    List<Configuration> configurations; 

    @OutputDirectory 
    File repoDir 

    @TaskAction 
    void build() { 
     for (Configuration configuration : configurations) { 
      copyJars(configuration) 
      copyPoms(configuration) 
     } 
    } 

    private void copyJars(Configuration configuration) { 
     configuration.resolvedConfiguration.resolvedArtifacts.each { artifact -> 
      def moduleVersionId = artifact.moduleVersion.id 
      File moduleDir = new File(repoDir, "${moduleVersionId.group.replace('.','/')}/${moduleVersionId.name}/${moduleVersionId.version}") 
      GFileUtils.mkdirs(moduleDir) 
      GFileUtils.copyFile(artifact.file, new File(moduleDir, artifact.file.name)) 
     } 
    } 

    private void copyPoms(Configuration configuration) { 
     def componentIds = configuration.incoming.resolutionResult.allDependencies.collect { it.selected.id } 

     def result = project.dependencies.createArtifactResolutionQuery() 
      .forComponents(componentIds) 
      .withArtifacts(MavenModule, MavenPomArtifact) 
      .execute() 

     for(component in result.resolvedComponents) { 
      def componentId = component.id 

      if(componentId instanceof ModuleComponentIdentifier) { 
       File moduleDir = new File(repoDir, "${componentId.group.replace('.','/')}/${componentId.module}/${componentId.version}") 
       GFileUtils.mkdirs(moduleDir)     
       File pomFile = component.getArtifacts(MavenPomArtifact)[0].file 
       GFileUtils.copyFile(pomFile, new File(moduleDir, pomFile.name)) 
      }   
     } 
    } 
} 

使用

task copyMavenArtifacts(type: MavenArtifactCopyTask) { 
    configurations = [project.configurations.all, project.buildScript.configurations.classpath] 
    repoDir = file("$buildDir/mavenArtifacts") 
} 

一旦所有的罐子&劲歌是在Maven的目录结构,你可以在本地文件夹改编

  1. 他们全部上传到另一个仓库
  2. 使用文件夹作为Maven仓库
+0

我几乎得到了我想要的地方,使用你的建议。谢谢! 然而,问题在于我不知道如何获得POM的母体POM。有任何想法吗? – Cleankod

+0

嗯...可以从'configuration.incoming.resolutionResult.allComponents'获取id而不是'configuration.incoming.resolutionResult.allDependencies'(参见[getAllComponents()](https://docs.gradle.org/3.4/ javadoc/org/gradle/api/artifacts/result/ResolutionResult.html#getAllComponents%28%29)) –

+0

让我知道它是否有效。我可能会为此发布一个插件 –