web-dev-qa-db-ja.com

プラグインブロックでプロジェクトの追加プロパティを使用できません

私はマルチプロジェクトビルドを持っていますが、多くの場合、アーティファクトのバージョンを全面的にロックしています。したがって、私のルートプロジェクトでは、次のように定義します。

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を使用すると非常に簡単で、使用してもかまいませんが、疑問に思っています。

9
Rohan Prabhu

ドキュメント によると(制約付き構文サブセクションを参照)

"プラグインバージョン"と"プラグインID"は定数、リテラル、文字列である必要があります

次の段落には、質問に関連するその他の注意事項がいくつかあります。

プラグイン{}ブロックも、ビルドスクリプトの最上位ステートメントである必要があります。別の構造(ifステートメントやforループなど)内にネストすることはできません。

ビルドスクリプトでのみ使用できます

プラグイン{}ブロックは現在、プロジェクトのビルドスクリプトでのみ使用できます。スクリプトプラグイン、settings.gradleファイル、またはinitスクリプトでは使用できません。

Gradleの将来のバージョンでは、この制限が削除されます。

したがって、現在これを行うことはできません。

プラグインのバージョンを抽出して後で使用するための 回避策 がありますが、個人的には見苦しく、明示的なバージョンを使用することを好みます。

5
kropp

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")}")
}

公式ドキュメント

4
nimelorm