如何在gradle任务中获取传递依赖的信息?

Fre*_*ind 4 plugins dependencies task gradle transitive-dependency

我想在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}"
        }
      }
    }
  }

}
Run Code Online (Sandbox Code Playgroud)

但它只打印声明的,没有传递的.

这意味着,如果我dependencies是:

dependencies {
    compile "com.google.guava:guava:18.0"
    compile 'org.codehaus.groovy:groovy-all:2.3.11'
    testCompile 'junit:junit:4.11'
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

小智 5

最后,我通过跟进任务弄清楚了

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
}
Run Code Online (Sandbox Code Playgroud)