Dump dependencies flat and for a specific package

android

(Edgar (Algebr)) #1

I know how to get gradle to dump the depencies of an Android project with ./gradlew app:dependencies but what I want is:

  1. For a specific build, not just all of them.
  2. in a flat format, not a tree I need to parse
  3. For a specific package, not just one.

(Eric Wendelin) #2

I would highly recommend you try creating a build scan for this, which will show a filterable dependency tree like this one.

Two caveats, though:

  1. The build scan isn’t exportable unless you’re a Gradle Enterprise customer
  2. I’m not perfectly clear what you mean by “specific package”. Do you mean specific library dependency or specific Java package?

Cheers,
Eric


(Edgar (Algebr)) #3

Thanks, I will look up build scan and whatnot. I would like to have a flat list of dependencies too, rather than in a tree.

Re the package, I mean like for com.facebook.fresco:imagepipeline-okhttp3:1.0.1. I want to find all the dependencies of that, that is including transitive ones too.


(Schalk Cronjé) #4

Will this work for you? I used compile configuration as an example.

configurations.compile.allDependencies.each { Dependency d->
  println "${d.group}:${d.name}:${d.version}"
}

Very rough-and-ready, and only prints to the console, but should give you an idea where to start.


(Edgar (Algebr)) #5

Thanks,

I tried in the root build.gradle of an android project:

task foo { configurations.compile.allDependencies.each { Dependency d-> println "${d.group}:${d.name}:${d.version}" } }

But this errors with:


* What went wrong:
A problem occurred evaluating root project 'android'.
> Could not get unknown property 'compile' for configuration container.

(Schalk Cronjé) #6

You need to replace cmopile with a valid configuration name. Your root project will probably contain no configurations. Try the same in the app subproject. Valid configuration names are the same as which would be returned by app:dependencies


(Edgar (Algebr)) #7

Thanks, will try.

This code sample, it will only print out the first level of dependencies right, not the transitive ones as well.


(Chris Doré) #8

Is this useful (using junit as an example instead of imagepipeline-okhttp3)?

dependencies {
    compile 'org.spockframework:spock-core:+'
}

task dumpDepsOfInterest {
    doLast {
        def componentOfInterest = configurations.compile.incoming.resolutionResult.allComponents.find { comp ->
            comp.moduleVersion.group == 'junit' && comp.moduleVersion.name == 'junit'
        }
        if( componentOfInterest != null ) {
            println componentOfInterest.moduleVersion

            def deps = []
            deps.addAll( componentOfInterest.dependencies )

            while( deps.size() > 0 ) {
                def currDep = deps.pop()
                if( currDep instanceof ResolvedDependencyResult ) {
                    println currDep.selected.moduleVersion
                    deps.addAll( currDep.selected.dependencies )
                } else {
                    throw new GradleException( "Could not resolve ${currDep.requested}" )
                }
            }
        } else {
            throw new GradleException( "Could not find component of interest" )
        }
    }
}

Dependecy tree:

$ ./gradlew dependencies --configuration=compile -q
compile - Dependencies for source set 'main' (deprecated, use 'implementation ' instead).
\--- org.spockframework:spock-core:+ -> 1.1-groovy-2.4
     +--- org.codehaus.groovy:groovy-all:2.4.9
     \--- junit:junit:4.12
          \--- org.hamcrest:hamcrest-core:1.3

Task output:

$ ./gradlew dumpDepsOfInterest -q
junit:junit:4.12
org.hamcrest:hamcrest-core:1.3

(Edgar (Algebr)) #9

Oh awesome! I modified it slightly and works for me great! Thanks!