web-dev-qa-db-ja.com

Gradle Kotlin DSL:Kotlinのバージョンを独自の場所で定義する

Gradleビルドスクリプトを説明するために、build.gradle.ktsファイルを介してKotlinを使用できます。 dependenciesセクションとビルドpluginセクションの両方で、使用するthe Kotlinバージョンをグローバルに定義することは一般的な問題です(バージョンが異なることはあまり一般的ではありません)特定のケースで使用中)。

次のコードを検討してください(Gradle 4.3.1)。

plugins {
    var pluginVersion = "1.2.30"
    kotlin("jvm").version(kotlinVersion)
    // more
}

var dependencyVersion = "1.2.30"
dependencies {
    compile(kotlin("stdlib", kotlinVersion))
    compile(kotlin("reflect", kotlinVersion))
    testCompile(kotlin("test", kotlinVersion))
    // more
}

ご覧のとおり、kotlin version(この場合は1.2.30)が定義されていますtwicedependencyVersionおよびpluginVersion、これは非常に頻繁に違いはありませんです。 DSLの制限により、pluginVersionブロックの外部からpluginsにアクセスしたり、dependencyVersionブロック内からpluginsにアクセスしたりすることはできません。

バージョン文字列"1.2.30"を1つの場所に抽出するにはどうすればよいですか?

20
s1m0nw1

Gradleの新しいバージョンでは、kotlin(stdlib|reflect|test)依存関係のバージョンを指定する必要がなくなりました。Kotlinプラグインが自動的に構成します。

1つの場所への依存関係を抽出することに関しては、2つの主要なパターンがあります。

  • _buildSrc/src/main/kotlin/_内のオブジェクトで共有する定数を定義し、そのオブジェクトをビルドスクリプトで使用します。buildSrcのコードは、pluginsブロックを含むスクリプト全体で使用できます
  • システムプロパティを使用すると、_gradle.properties_を名前の前に付けることで_systemProp._にシステムプロパティを定義でき、System.getProperties()を介してシステムプロパティにアクセスできます。次に例を示します。

    _// build.gradle.kts
    plugins {
      val kotlinVersion by System.getProperties()
      println("Kotlin version is $kotlinVersion")
    }
    
    // gradle.properties
    systemProp.kotlinVersion=1.2.20
    _

プラグインクラスからバージョンを抽出できます。

import org.jetbrains.kotlin.gradle.plugin.KotlinPluginWrapper

plugins {
    kotlin("jvm") version "1.2.0"
}

val kotlinVersion = plugins.getPlugin(KotlinPluginWrapper::class.Java).kotlinPluginVersion
5
Ingo Kegel

kotlinプラグインに対して定義されたバージョンを検索し、これを外部変数に割り当てる回避策があります。以下にこれを示します。

val kotlinVersion: String? by extra {
    buildscript.configurations["classpath"]
            .resolvedConfiguration.firstLevelModuleDependencies
            .find { it.moduleName == "kotlin-gradle-plugin" }?.moduleVersion
}

plugins {
    kotlin("jvm").version("1.2.30")
    //more
}

その後、変数kotlinVersiondependenciesで問題なく使用できます。

1
s1m0nw1

@ s1m0nw1コメントに対する回答(コメントとしては長すぎます):いいえ、buildSrc/build.gradleでbuildSrc/srcのものを使用することはできません。 Androidベースのプラグインを作成し、buildsSrcでAndroid gradle plugin依存関係が必要ですが、プロジェクトでこの依存関係も宣言しているため、この問題が発生しました。そのため、2つの異なる場所と2つのバージョンを維持する必要がありました。 。

BuildSrcディレクトリにgradle.propertiesファイルを作成することで、これを解決しました。その中で私は小道具を作成しましたandroidGradlePluginVersion=3.6.0-rc02

buildSrc/build.gradle:

val androidGradlePluginVersion: String by project
dependencies {
    implementation("com.Android.tools.build:gradle:$androidGradlePluginVersion")

buildSrc/src /.../ Versions.kt:

var Android_PLUGIN = loadAndroidGradlePluginVersion()

小道具のUtil:

fun loadAndroidGradlePluginVersion(): String {
    Properties().apply { load(FileInputStream(GRADLE_PROPERTIES)) }.let {
        return it.getProperty(Android_PLUGIN_VERSION_PROP)
    }

    error("Provide $Android_PLUGIN_VERSION_PROP in $GRADLE_PROPERTIES")
} 
0
Kostek