私はマルチプロジェクトビルドを持っていますが、多くの場合、アーティファクトのバージョンを全面的にロックしています。したがって、私のルートプロジェクトでは、次のように定義します。
project.extra.set("pkgVersions", mapOf(
"kotlin" to "1.2.0",
"jooq" to "3.10.2"
))
val pkgVersions : Map<String, String> by project.extra
plugins {
base
kotlin("jvm") version "1.2.0" apply false
}
pkgVersions
は、他のサブプロジェクトを含め、どこでも使用できます。
val pkgVersions by rootProject.extra
jooq {
version = pkgVersions["jooq"]
}
プラグインブロック内でこれを行うことはできません:
plugins {
kotlin("jvm") version pkgVersions["kotlin"]
}
「このコンテキストでは、暗黙のレシーバーからpkgVersionsを呼び出すことはできません。必要に応じて明示的なレシーバーを使用してください」というエラーが表示されます。これは、暗黙のレシーバーがおそらくファイルのJVMインプレッションである必要があるためだと思いますか?しかし、代わりにPluginDependencySpec
を使用しています。 this@
でオートコンプリートを試行すると、this@plugin
のみが表示されます。これは私からの単なる長期的な推測です。しかし、私が何をすべきかについての指針はありますか?
また、その間に、gradle-kotlin-dsl
にグローバルタイプを作成する方法はありますか?例:
data class MyBuildType(..)
buildSrc
を使用せずにどこでも利用できますか? buildSrc
を使用すると非常に簡単で、使用してもかまいませんが、疑問に思っています。
ドキュメント によると(制約付き構文サブセクションを参照)
"プラグインバージョン"と"プラグインID"は定数、リテラル、文字列である必要があります
次の段落には、質問に関連するその他の注意事項がいくつかあります。
プラグイン{}ブロックも、ビルドスクリプトの最上位ステートメントである必要があります。別の構造(ifステートメントやforループなど)内にネストすることはできません。
ビルドスクリプトでのみ使用できます
プラグイン{}ブロックは現在、プロジェクトのビルドスクリプトでのみ使用できます。スクリプトプラグイン、settings.gradleファイル、またはinitスクリプトでは使用できません。
Gradleの将来のバージョンでは、この制限が削除されます。
したがって、現在これを行うことはできません。
プラグインのバージョンを抽出して後で使用するための 回避策 がありますが、個人的には見苦しく、明示的なバージョンを使用することを好みます。
build.gradle.ktsルート
buildscript {
val kotlinVersion by rootProject.extra { "1.3.10" }
...
}
build.gradle.ktsモジュール
dependencies {
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:${rootProject.extra.get("kotlinVersion")}")
}