2017-12-07 3 views
0

Ich habe ein Multi-Projekt-Build, und meistens finde ich mich Locking-Versionen für Artefakte auf der ganzen Linie. Also in meinem Stammprojekt definiere ich so etwas wie:Ich kann keine zusätzlichen Projekteigenschaften im Plugin-Block verwenden

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 
} 

Während ich pkgVersions überall, einschließlich anderen Teilprojekten verwenden kann:

val pkgVersions by rootProject.extra 

jooq { 
    version = pkgVersions["jooq"] 
} 

ich nicht in der Lage bin so in einem Plugin-Block zu tun:

Gibt mir den Fehler "pkgVersions kann in diesem Kontext nicht von impliziten Empfänger aufgerufen werden. Verwenden Sie die explizite, falls erforderlich". Ich gehe davon aus, dass der implizite Empfänger wahrscheinlich die JVM-Impression der Datei ist? Aber stattdessen verwendet es PluginDependencySpec. Wenn Sie eine automatische Vervollständigung mit [email protected] versuchen, wird nur [email protected] angezeigt. Dies ist nur eine langfristige Schätzung von mir. Aber, irgendwelche Hinweise darauf, was ich tun soll?

Auch wenn wir schon dabei sind, gibt es eine Möglichkeit, einen globalen Typen in gradle-kotlin-dsl, zum Beispiel zu erstellen:

data class MyBuildType(..) 

und hat es überall verfügbar OHNE buildSrc mit? Es ist ziemlich einfach mit buildSrc und ich habe nichts dagegen, es zu benutzen, aber ich frage mich nur.

Antwort

1

Nach documentation (siehe Constrained Syntax Unterabschnitt)

«Plugin-Version» und «Plugin-ID» muss konstant, wörtlich, Strings

sein Es gibt einige andere Hinweise im Zusammenhang mit Ihre Frage in den folgenden Absätzen:

Der Plugins {} Block muss auch eine oberste Ebene st sein atment im Buildskript. Es kann nicht in einem anderen Konstrukt verschachtelt sein (z. B. eine if-Anweisung oder eine for-Schleife).

Kann nur in Build-Skripte verwendet werden

Die Plugins {} Block zur Zeit nur in einem Projekt Skript Build verwendet werden. Es kann nicht in Skript-Plugins, settings.gradle-Dateien oder Init-Skripten verwendet werden.

Zukünftige Versionen von Gradle werden diese Einschränkung entfernen.

So ist es jetzt nicht möglich, dies zu tun.

Es gibt eine workaround, die Plugin-Version zu extrahieren und danach zu verwenden, aber ich persönlich finde es hässlich und bevorzuge die Verwendung expliziter Versionen.

Verwandte Themen