2015-05-17 52 views
2

我想要在gradle任务中获取所有依赖关系(包括可传递依赖关系)的信息。如何获取gradle任务中传递依赖的信息?

我试过代码:

class MyGradlePlugin implements Plugin<Project> { 

    void apply(Project project) { 
    project.afterEvaluate { 
     println " Project:" + project.name 
     project.configurations.each { conf -> 
     println " Configuration: ${conf.name}" 
     conf.allDependencies.each { dep -> 
      println "  ${dep.group}:${dep.name}:${dep.version}" 
     } 
     } 
    } 
    } 

} 

但只打印申报的,没有传递的。

这意味着,如果我的dependencies是:

dependencies { 
    compile "com.google.guava:guava:18.0" 
    compile 'org.codehaus.groovy:groovy-all:2.3.11' 
    testCompile 'junit:junit:4.11' 
} 

它只打印这3依赖性,但org.hamcrest:hamcrest-core:1.3这是不显示的junit:junit:4.11的传递依赖。

如何修改代码以让其显示org.hamcrest:hamcrest-core:1.3

PS:我知道gradle dependencies任务会显示我想要的一切,但我需要手动获取依赖关系信息并以我自己的格式打印它。

+1

您需要解决的依赖关系,例如'project.configurations.detachedConfiguration(deps依赖[])。resolvedConfiguration'。有关示例,请参阅[gradle-versions-plugin](https://github.com/ben-manes/gradle-versions-plugin)。 –

回答

3

最后,我搞清楚其后续任务

class Dep { 
    String group 
    String name 
    String version 
    String extention 
    String classifier 

    Dep(String group, String name, String version, String extension, String classifier) { 
    this.group = group 
    this.name = name 
    this.version = version 
    this.extention = extension 
    this.classifier = classifier 
    } 
} 

task collectAllDeps << { 

    def deps = [] 
    configurations.each { 
    conf -> 
     conf.getResolvedConfiguration().getResolvedArtifacts().each { 
     at -> 
      def dep = at.getModuleVersion().getId() 
      println at.getFile().getAbsolutePath() 
      //   dep = dep1.getComponentIdentifier() 
      println "$dep.group:$dep.name:$dep.version" 
      deps.add(new Dep(dep.group, dep.name, dep.version, at.extension, at.classifier)) 
     } 
    } 

    def json = groovy.json.JsonOutput.toJson(deps) 
    json = groovy.json.JsonOutput.prettyPrint(json) 

    new File("deps.json") << json 
}