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)が定義されていますtwice:dependencyVersion
およびpluginVersion
、これは非常に頻繁に違いはありませんです。 DSLの制限により、pluginVersion
ブロックの外部からplugins
にアクセスしたり、dependencyVersion
ブロック内からplugins
にアクセスしたりすることはできません。
バージョン文字列"1.2.30"
を1つの場所に抽出するにはどうすればよいですか?
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
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
}
その後、変数kotlinVersion
をdependencies
で問題なく使用できます。
@ 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")
}