Is it possible to use Gradle to produce a tree of what depends on what?
I have a project and would like to find out all the dependencies so I may be able to prune it a little with forward declarations etc.
gradle dependencies
should work. Its crazy how everyone has gradlew app:dependencies
probably because Android.
Without modules:
gradle dependencies
For Android:
gradle app:dependencies
Using gradle wrapper:
./gradlew app:dependencies
Note: Replace app
with the project module name.
Additionally, if you want to check if something is compile
vs. testCompile
vs androidTestCompile
dependency as well as what is pulling it in:
./gradlew :app:dependencyInsight --configuration compile --dependency <name>
./gradlew :app:dependencyInsight --configuration testCompile --dependency <name>
./gradlew :app:dependencyInsight --configuration androidTestCompile --dependency <name>
You can render the dependency tree with the command gradle dependencies
. For more information check the section Listing dependencies in a project in the online user guide.
build.gradle
file) or your build file doesn't apply any plugin.
./gradlew dependencies
If you find it hard to navigate console output of gradle dependencies
, you can add the Project reports plugin:
apply plugin: 'project-report'
And generate a HTML report using:
$ ./gradlew htmlDependencyReport
Report can normally be found in build/reports/project/dependencies/index.html
https://i.stack.imgur.com/mIybP.png
gradle htmlDependencyReport
gradle dependencyReport
In Android Studio (at least since v2.3.3) you can run the command directly from the UI:
Click on the Gradle tab and then double click on :yourmodule -> Tasks -> android -> androidDependencies
The tree will be displayed in the Gradle Console tab
https://i.stack.imgur.com/uInQi.jpg
Often the complete testImplementation
, implementation
, and androidTestImplementation
dependency graph is too much to examine together. If you merely want the implementation
dependency graph you can use:
./gradlew app:dependencies --configuration implementation
Source: Listing dependencies in a project
Note: compile
has been deprecated in more recent versions of Gradle and in more recent versions you are advised to shift all of your compile
dependencies to implementation
. Please see this answer here
:dependencies
instead of app:dependencies
.
For me, it was simply one command
in build.gradle
add plugin
apply plugin: 'project-report'
and then go to cmd and run following command
./gradlew htmlDependencyReport
This gives me an HTML report WOW Html report 💕
Or if you want the report in a text file, to make search easy use following command
gradlew dependencyReport
https://i.stack.imgur.com/a2YtF.png
That's all my lord.
html
file will be found in build/reports/project/dependencies/root.html
If you want to visualize your dependencies in a graph you can use gradle-dependency-graph-generator plugin.
Generally the output of this plugin can be found in build/reports/dependency-graph directory and it contains three files (.dot|.png|.svg) if you are using the 0.5.0 version of the plugin.
Example of dependences graph in a real app (Chess Clock):
https://i.stack.imgur.com/izCd0.png
For Android, type this in terminal
gradlew app:dependencies
It will list all the dependencies and the ones with newer versions for you to upgrade like
com.android.support:customtabs:26.1.0 -> 27.1.1 (*)
(*)
is wrong. (*)
means this dependency declares to use the former(26.1.0) but actually build will use the latter version(27.1.1) this answer talked about this.
Things have moved forward in Gradle so I believe this question merits another answer.
Since Gradle 4.3, "build scans" were introduced. All relevant info is available in the Gradle docs (1, 2). For me, this seems to now be the easiest way to check your dependencies (and generally your build) in a clear, organized way.
They are very easy to create, just execute:
gradle build --scan
(or ./gradlew build --scan
if you use a wrapper)
This produces a randomly generated link where you can see your scan. When opening that link, you enter your email and gain full control of the link: eg. share it or delete it. It has got a lot of info about your build, not just dependencies. You can see your dependencies, their hierarchies, the repository used to obtain them but also a lot of other stuff about your build, namely, its performance (which is of interest in big complex builds), your tests, even your console output and your system configuration, which JDK and JVM was used, max heap size etc.
This is a printscreen from a mock project:
https://i.stack.imgur.com/ybLD5.png
A build scan is a shareable record of a build that provides insights into what happened and why. You can create a build scan at scans.gradle.com for free.
Note however, that info for your build process will be sent to the Gradle servers. You have full control to delete it when you are finished with your inspection.
Finally, you can use build scans with Gradle versions earlier than 4.3 too, you just have to manually add the scans plugin in your buildscript.
Edit: Incorporating some feedback from the comments some extra notes: 1) It is very difficult to do this by mistake or without understanding that some info for your build will be online (private to you, with the ability to delete it, but still online).
When executing gradle build --scan
the following message appears:
Publishing a build scan to scans.gradle.com requires accepting the Gradle
Terms of Service defined at https://gradle.com/terms-of-service. Do you
accept these terms? [yes, no]
You have to explicitly write yes
and then the message continues:
Publishing build scan...
https://gradle.com/s/a12en0dasdu
2) In Gradle Enterprise you can host gradle build scans in your own servers. However I have no experience in this and my proposed approach was about the standard Gradle distribution, using Gradle's servers for your build scans.
3) Gradle itself promotes the build scans as the way to deal with most your build problems.
gradle build --scan
you publish details of your build somewhere on internet - and to delete it you have to associate it with working e-mail address.
gradle build --scan
in cmd, you are prompted: Publishing a build scan to scans.gradle.com requires accepting the Gradle Terms of Service defined at https://gradle.com/terms-of-service. Do you accept these terms? [yes, no]
. You have to manually write yes
. Just after that, you get the message: Publishing build scan... https://gradle.com/s/a12en0dasdu
(randomly put link of the same type). So I believe it does warn you appropriately before. (1/2)
For recent versions of Gradle (I tested with the 6.4.1 version):
gradle dependencies --configuration compileClasspath
or if you're using the Gradle Wrapper:
gradlew dependencies --configuration compileClasspath
When building for Android with the 'debug' and 'release' compilation profiles, the debugCompileClasspath
and releaseCompileClasspath
configurations can be used instead of compileClasspath
.
I also found useful to run this:
./gradlew dI --dependency <your library>
This shows how are being dependencies resolved (dependencyInsight
) and help you debugging into where do you need to force or exclude libraries in your build.gradle
See: https://docs.gradle.org/current/userguide/tutorial_gradle_command_line.html
In Android Studio
1) Open terminal and ensure you are at project's root folder.
2) Run ./gradlew app:dependencies
(if not using gradle wrapper, try gradle app:dependencies
)
Note that running ./gradle dependencies
will only give you dependency tree of project's root folder, so mentioning app in above manner, i.e. ./gradlew app:dependencies
is important.
Note that you may need to do something like ./gradlew <module_directory>:<module_name>:dependencies
if the module has extra directory before reach its build.gradle. When in doubt, do ./gradlew tasks --all
to check the name.
If you want all the dependencies in a single file at the end within two steps. Add this to your build.gradle.kts
in the root of your project:
project.rootProject.allprojects {
apply(plugin="project-report")
this.task("allDependencies", DependencyReportTask::class) {
evaluationDependsOnChildren()
this.setRenderer(AsciiDependencyReportRenderer())
}
}
Then apply:
./gradlew allDependencies | grep '\-\-\-' | grep -Po '\w+.*$' | awk -F ' ' '{ print $1 }' | sort | grep -v '\{' | grep -v '\[' | uniq | grep '.\+:.\+:.\+'
This will give you all the dependencies in your project and sub-projects along with all the 3rd party dependencies.
If you want to get this done in a programmatic way, then you'll need a custom renderer of the dependencies - you can start by extending the AsciiDependencyReportRenderer
that prints an ascii graph of the dependencies by default.
Success story sharing
./gradlew -q dependencies :dependencies
It looks on all your folders :P./gradlew :dependencies
will work. It will list the dependencies for all your projects, but it is easy to find the right one.