In gradle, how to use a variable for a plugin version?

前端 未结 4 875
故里飘歌
故里飘歌 2020-12-16 08:52

One of my build scripts imports that nebula plugin:

plugins {
  id \'nebula.ospackage\' version \'3.5.0\'
}

I\'ve been moving all of my ver

4条回答
  •  佛祖请我去吃肉
    2020-12-16 09:30

    Summary

    1. Omit the version from the plugin block
    2. Move/specify the version in the buildscript.dependencies block, instead
    3. Use a variable in that block that is a const variable

    In short, plugin blocks require string literals or properties whereas dependency blocks permit varables. The original question asks for doing this in a "single line" and with this approach, your plugin block is shorter and all your dependencies live in one place for all modules. Depending on your goals, that might be better than doing everything in "one line."

    Full Example

    For Android, I was able to do this by omitting the version from the plugin block and then specifying it as a const in the buildscript dependencies, instead. That block allows variables, whereas the plugin block only allows string literals. From there, I use an object in buildSrc because that provides the most flexibility, while keeping all dependency info in one file for all modules. So my setup looks like this:

    ├── project/
    │   ├── build.gradle
    |   └── app/
    |       └── build.gradle
    |   └── buildSrc/
    |       └── build.gradle.kts
    |       └── src/main/java/com/example/package/Deps.kt
    

    From there, to specify any plugin version as a variable in one place, the app/build.gradle file omits the version (using kotlin as an example but the same approach works for any plugin):

    app/build.gradle
    plugins {
        id 'kotlin-android' // omit version property here but provide it in buildscript dependencies
        ...
    }
    ...
    dependencies {
        ...
        // Dagger
        implementation Deps.Dagger.ANDROID_SUPPORT
        kapt Deps.Dagger.ANDROID_PROCESSOR
        kapt Deps.Dagger.COMPILER
    }
    

    Then the buildscript dependency section (usually in the parent build.gradle file but can also be in the same file) provides the version USING A VARIABLE!

    project/build.gradle
    import com.example.package.Deps // object in the buildSrc folder with all version info
    buildscript {
        dependencies {
            classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${Deps.kotlinVersion}"
        }
    }
    

    Lastly, all the version information is managed in buildSrc, with an object in the Deps.kt file (there are many blog posts out there on using buildSrc with Android projects):

    Deps.kt
    object Deps {
        // For use in the top-level buildscript dependency section which only works with a constant rather than `Deps.Kotlin.version`
        const val kotlinVersion = "1.3.72"
    
        object Kotlin :             Version(kotlinVersion) {
            val STDLIB =            "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$version"
        }
    
        object Dagger :             Version("2.25.2") {
            val ANDROID_SUPPORT =   "com.google.dagger:dagger-android-support:$version"
            val ANDROID_PROCESSOR = "com.google.dagger:dagger-android-processor:$version"
            val COMPILER =          "com.google.dagger:dagger-compiler:$version"
        }
    
    }
    open class Version(@JvmField val version: String)
    

    Overall, I really like this setup. It's flexible, all dependency info is in one place, even across multiple modules and, best of all, it allows for code completion in the gradle files, when typing dependencies!

提交回复
热议问题