gradlebuild.gradlegradle-kotlin-dslgradle-submodule

Gradle: Use central declaration of dependencies in "subprojects" block


I followed Gradle's instructions to a central point to define dependencies. I am using the libs.version.toml file to do that. see: Link

For this example, let's assume, that i have this libs.versions.toml:

[versions]
mockito = "4.1.0"
[libraries]
mockito = { module = "org.mockito.kotlin:mockito-kotlin", version.ref = "mockito" }

Now using it in the root or subprojects' build.gradle works fine, but when defining the subprojects block, where I define dependencies and plugins for all submodules, it does not work. Example root build.gradle:

plugins {
    (...)
}

// add dependencies for this module only
dependencies {
    testImplementation(libs.mockito) // works
}

subprojects {
    // add dependencies to every submodule
    dependencies {
        testImplementation(libs.mockito) // doesn't work
    }
}

Is there a way to achieve this, without adding every dependency to each subprojects' build.gradle? I am using Gradle 8.0.1.


Solution

  • This is a consequence of the way the subproject and allproject blocks are implemented in Gradle.

    You can make it work by prefixing the libs access with rootProject:

    subprojects {
        // add dependencies to every submodule
        dependencies {
            testImplementation(rootProject.libs.mockito) // Now works
        }
    }
    

    You can find more information about this in the Gradle issue tracker.

    However, Grade recommends to replace usage of allproject / subproject constructs with convention plugins.