2017-05-31 188 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

讓我知道它是否有效。我可能會爲此發佈一個插件 –