不能在插件块中使用项目额外的属性

我有一个多项目的构建,而且更多的时候我发现自己锁定了整个项目的工件版本。 所以在我的根项目中,我定义了如下的东西:

project.extra.set("pkgVersions", mapOf( "kotlin" to "1.2.0", "jooq" to "3.10.2" )) val pkgVersions : Map 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创建一个全局types ,例如:

 data class MyBuildType(..) 

并在任何地方都可以使用,而不使用buildSrcbuildSrc非常简单,我不介意使用它,但只是想知道。

根据文档 (请参阅约束语法子部分)

“插件版本”和“插件ID”必须是常量,字面量,字符串

在下面的段落中还有一些与你的问题有关的其他注释:

plugins {}块也必须是buildscript中的顶级语句。 它不能嵌套在另一个构造(例如if语句或for循环)中。

只能在构建脚本中使用

目前只能在项目的构建脚本中使用plugins {}块。 它不能在脚本插件,settings.gradle文件或init脚本中使用。

未来版本的Gradle将删除这个限制。

所以现在不可能做到这一点。

有一个解决方法来提取插件版本,然后使用它,但我个人觉得它很丑,更喜欢使用显式版本。

Interesting Posts