Skip to content

Instantly share code, notes, and snippets.

@medvedev
Last active October 23, 2023 16:56
Show Gist options
  • Save medvedev/968119d7786966d9ed4442ae17aca279 to your computer and use it in GitHub Desktop.
Save medvedev/968119d7786966d9ed4442ae17aca279 to your computer and use it in GitHub Desktop.
Gradle task that prints total dependencies size and (dependency+(size in kb)) list sorted by size desc
...
/* Tested with Gradle 6.3 */
tasks.register("depsize") {
description = 'Prints dependencies for "default" configuration'
doLast() {
listConfigurationDependencies(configurations.default)
}
}
tasks.register("depsize-all-configurations") {
description = 'Prints dependencies for all available configurations'
doLast() {
configurations
.findAll { it.isCanBeResolved() }
.each { listConfigurationDependencies(it) }
}
}
def listConfigurationDependencies(Configuration configuration) {
def formatStr = "%,10.2f"
def size = configuration.collect { it.length() / (1024 * 1024) }.sum()
def out = new StringBuffer()
out << "\nConfiguration name: \"${configuration.name}\"\n"
if (size) {
out << 'Total dependencies size:'.padRight(65)
out << "${String.format(formatStr, size)} Mb\n\n"
configuration.sort { -it.length() }
.each {
out << "${it.name}".padRight(65)
out << "${String.format(formatStr, (it.length() / 1024))} kb\n"
}
} else {
out << 'No dependencies found';
}
println(out)
}
...
@UltramanTIGA
Copy link

Hi,bro. My gradle version is 6.1.1, and I edit project root build.gradle as below:
`buildscript {
ext{
minSdkVersion = 23
targetSdkVersion = 29

    kotlinVersion = "1.3.72"
}
repositories {
    google()
    jcenter()
}
dependencies {
    classpath 'com.android.tools.build:gradle:4.0.1'
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
    classpath 'androidx.navigation:navigation-safe-args-gradle-plugin:2.3.0'

    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files
}

}

allprojects {
repositories {
google()
jcenter()
maven { url 'https://www.jitpack.io' }
}
}

task clean(type: Delete) {
delete rootProject.buildDir
}

subprojects { prj ->

prj.afterEvaluate {
    tasks.register("depsize") {
        description = 'Prints dependencies for "default" configuration'
        doLast() {
            listConfigurationDependencies(configurations.default)
        }
    }

    tasks.register("depsize-all-configurations") {
        description = 'Prints dependencies for all available configurations'
        doLast() {
            configurations
                    .findAll { it.isCanBeResolved() }
                    .each { listConfigurationDependencies(it) }
        }
    }
}

}

def listConfigurationDependencies(Configuration configuration) {
def formatStr = "%,10.2f"

def size = configuration.collect { it.length() / (1024 * 1024) }.sum()

def out = new StringBuffer()
out << "\nConfiguration name: \"${configuration.name}\"\n"
if (size) {
    out << 'Total dependencies size:'.padRight(65)
    out << "${String.format(formatStr, size)} Mb\n\n"

    configuration.sort { -it.length() }
            .each {
                out << "${it.name}".padRight(65)
                out << "${String.format(formatStr, (it.length() / 1024))} kb\n"
            }
} else {
    out << 'No dependencies found';
}
println(out)

}`
I run "gradle depsize" and get result: No dependencies found

What wrong with my use? Please help me...

@medvedev
Copy link
Author

@UltramanTIGA did you try running gradle depsize-all-configurations? What's the output?

@UltramanTIGA
Copy link

@medvedev Oh, awesome! It output the list with many configuration name, some of them show "No dependencies found", and some show the dependencies list.
So you mean I should change the configuration name as what I want?

@medvedev
Copy link
Author

@UltramanTIGA
Yep, you may for example change "depsize" task to use a configuration other than "default".

@UltramanTIGA
Copy link

@medvedev Ok.Thanks a lot!

@phi1ipp
Copy link

phi1ipp commented Nov 10, 2020

In case somebody needs the same in .kts

tasks.register("depsize") {
	description = "Prints dependencies for \"default\" configuration"
	doLast {
		listConfigurationDependencies(configurations["default"])
	}
}

tasks.register("depsize-all-configurations") {
	description = "Prints dependencies for all available configurations"
	doLast {
		configurations
				.filter { it.isCanBeResolved }
				.forEach { listConfigurationDependencies(it) }
	}
}

fun listConfigurationDependencies(configuration: Configuration ) {
	val formatStr = "%,10.2f"

	val size = configuration.map { it.length() / (1024.0 * 1024.0) }.sum()

	val out = StringBuffer()
	out.append("\nConfiguration name: \"${configuration.name}\"\n")
	if (size > 0) {
		out.append("Total dependencies size:".padEnd(65))
		out.append("${String.format(formatStr, size)} Mb\n\n")

		configuration.sortedBy { -it.length() }
				.forEach {
					out.append(it.name.padEnd(65))
					out.append("${String.format(formatStr, (it.length() / 1024.0))} kb\n")
				}
	} else {
		out.append("No dependencies found")
	}
	println(out)
}

@dzikoysk
Copy link

dzikoysk commented Jun 7, 2021

@phi1ipp thanks :)

@ansyori28
Copy link

Hi, I'm getting this error > Could not get unknown property 'default' for configuration container of type org.gradle.api.internal.artifacts.configurations.DefaultConfigurationContainer. when I run ./gradlew depsize.
I'm using gradle 7.2.2 by the way, any help will be much appreciated.
Thanks.

@og-abdul-mateen
Copy link

og-abdul-mateen commented Sep 21, 2022

For anyone who is having issues with the configurations.default, you can do the following.

  1. Print all your configurations to see what you've got.
  2. Replace default with a configuration that you would like to analyze. For example, you can use debugImplementationDependenciesMetadata instead of default.
  3. Run ./gradlew depsize

cc: @ansyori28

@Arkhypov
Copy link

configurations["default"].isCanBeResolved = true

on the top of build.gradle.kts

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment