2017-06-16 3 views
1

Ich versuche, meine Build-Dateien wie in groovy zu organisieren, indem Sie Werte in einer separaten Datei wiederverwenden. Aber ich kann die Syntax nicht verstehen, um dasselbe im kotlin DSL zu machen.Wie werden zusätzliche Eigenschaften in der Kotlin DSL gesetzt?

Hier ist, was ich in root build.gradle.kts mit:

applyFrom("config.gradle.kts") 

buildscript { 
    repositories { 
     google() 
     jcenter() 
    } 
    dependencies { 
     val test = project.extra["minSdkVer"] 
     classpath("com.android.tools.build:gradle:3.0.0-alpha4") 
     classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.1.2-5") 
     // NOTE: Do not place your application dependencies here; they belong 
     // in the individual module build.gradle files 
    } 
} 

allprojects { 
    repositories { 
     google() 
     jcenter() 
     mavenCentral() 
    } 
} 

und hier ist, was in den config.gradle.kts, auf die verwiesen wird:

mapOf(
     Pair("minSdkVer", 22), 
     Pair("targetSdkVer", 25), 
     Pair("compiledSdkVer", 25), 
     Pair("buildToolsVer", "26-rc4") 
).entries.forEach { 
    project.extra.set(it.key, it.value) 
} 

Aber es gibt eine Fehler:

Cannot get property 'minSdkVer' on extra properties extension as it does not exist

Antwort

1

Eine korrekte fix: Gradle sammelt und appl ies die buildscript { ... } Blöcke von Ihrem Skript, bevor Sie irgendetwas anderes davon ausführen. Also, Ihre Eigenschaften von config.gradle.kts verfügbar innerhalb der buildscript zu machen, sollen Sie applyFrom("config.gradle.kts") zu Ihrem buildscript { ... } Block verschieben:

buildscript { 
    applyFrom("config.gradle.kts") 

    /* ... */ 
} 

Ein weiterer möglicher Fehler ist mit einer zusätzlichen Eigenschaft als extra["minSdkVer"] in einem Rahmen eines anderen ExtensionAware, wie eine Aufgabe, in diesem Beispiel:

val myTask = task("printMinSdkVer") { 
    doLast { 
     println("Extra property value: ${extra["minSdkVer"]}") 
    } 
} 

in diesem Fall verwendet extra.get(...) nicht die project.extra bu t die extra der Aufgabe.

Um das zu beheben, geben Sie an, dass Sie mit dem Projekt arbeiten. Direkte Verwendung:

println(project.extra["minSdkVer"]) 

Und für die Delegation.

val minSdkVer by project.extra 
+0

Kühl. Ich brauchte eine Sekunde, um herauszufinden, was Sie mit Scoping meinen. Das Anwenden von applyFrom() innerhalb des Buildscript-Blocks funktioniert. Es macht keinen vollständigen Sinn, da die project.extra nicht durch den ExtensionAware-Bereich betroffen sein sollte, oder? – Daykm

+0

@Daykm, jetzt sehe ich, dass es in Ihrem Fall ein ganz anderes Problem gab: Gradle sammelt und führt die 'Buildscript' - Blöcke strikt vor allem anderen im Skript aus, also sollte die korrekte Lösung darin bestehen, ein anderes Skript im' 'anzuwenden Buildscript' Block und nicht außerhalb. – hotkey

+0

@Daykm, aktualisierte die Antwort mit einer Erklärung. – hotkey

Verwandte Themen