2017-06-16 104 views
1

我试图组织我的构建文件,因为我会在groovy中,通过在单独的文件中重用值。但我不明白在kotlin DSL中做同样的事情的语法。如何在Kotlin DSL中设置Gradle额外属性?

下面是我用了根build.gradle.kts什么:

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

,这里是什么在被引用的config.gradle.kts:

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

但有一个错误:

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

回答

1

一个正确的解决办法:摇篮收集和申请在执行其他任何操作之前严格禁止脚本中的buildscript { ... }块。所以,从config.gradle.kts可用buildscript内让你的财产,你应该将applyFrom("config.gradle.kts")buildscript { ... }块:在另一ExtensionAware一个范围

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

    /* ... */ 
} 

另一个可能的错误是使用一个额外的属性为extra["minSdkVer"],像在这个例子中一个任务:

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

在这种情况下,extra.get(...)使用不project.extra BU t任务的extra

要解决该问题,请指定您使用该项目。直接使用:

println(project.extra["minSdkVer"]) 

并且授权。

val minSdkVer by project.extra 
+0

很酷。花了我一秒的时间来弄清楚你是什么意思的范围。将buildFrom()放在buildscript块中。这并不完全合理,因为project.extra不应该受到ExtensionAware范围的影响,对吧? – Daykm

+0

@Daykm,现在我发现在你的情况中存在一个完全不同的问题:Gradle在脚本的其他任何部分之前收集并执行'buildscript'块,因此,理想的是,正确的修复方法是在' buildscript'块,而不是在外面。 – hotkey

+0

@Daykm,用解释更新了答案。 – hotkey

相关问题