当前位置: 首页 > 知识库问答 >
问题:

无法在插件块中使用项目额外属性

戚明朗
2023-03-14

我有一个多项目构建,而且我经常发现自己全面锁定了工件的版本。因此,在我的根项目中,我定义了如下内容:

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非常简单,我不介意使用它,但只是想知道。

共有2个答案

谷梁智
2023-03-14

根据留档(参见约束语法小节)

插件版本和插件id必须是常量、文字、字符串

以下各段载有与你的问题有关的其他说明:

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

只能在生成脚本中使用

插件{}块当前只能在项目的构建脚本中使用。它不能用于脚本插件和设置。gradle文件或init脚本。

Gradle的未来版本将取消这一限制。

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

有一个解决方法可以提取插件版本并在之后使用它,但我个人觉得它很难看,更喜欢使用显式版本。

杜起运
2023-03-14

显然,如果过去不可能的话,这最近已经成为可能。(几乎)来自文档:

gradle.properties

helloPluginVersion=1.0.0

settings.gradle.kts

kotlin prettyprint-override">pluginManagement {
  val helloPluginVersion: String by settings
  plugins {
    id("com.example.hello") version helloPluginVersion
  }
}

现在文档说< code>build.gradle.kts应该是空的,但是我的测试显示在< code>build.gradle.kts中仍然需要它:

plugins {
  id("com.example.hello")
}

现在,版本由< code>settings.gradle.kts决定,因此由我们需要的< code>gradle.properties决定...

 类似资料:
  • 我有一个多模块的项目,有两个模块:war和ear模块。我正在尝试使用Maven发行版插件来管理发行版。 我的配置到目前为止... 父POM: war模块POM: ear模块POM: 正如您看到的表单日志,test-war-0.0.1-sources.jar正在上传两次。这是为什么?我怎样才能编辑我的配置,使它只上传一次?

  • 我一直在尝试在我的Android应用程序中使用AppCompat组件,但出于某些原因,SetContentView方法不断抛出: Android意见。充气异常:二进制XML文件行#1:二进制XML文件行#1:错误充气类android。支持设计小装置。文本输入布局 异常的堆栈跟踪: 在系统中。运行时。例外服务。例外DispatchInfo。在/Users/builder/data/lanes/354

  • 我是maven的新手,在使用程序集插件生成zip文件时花了大约3天的时间,引用了http://www.petrikainulainen.net/programming/tips-and-tricks/creating-a-runnable-binary-distribution-with-maven-assembly-plugin/My project is multi module,所以我还引用

  • 在这种情况下,我必须读取某个属性文件,然后调用一个外部程序。 > 为了读取属性文件,我使用了属性Maven插件,在验证阶段使用 为了执行外部程序,我使用execmaven插件,调用goal 但是,如果我调用“mvn exec:exec”,则不会调用验证阶段,因此不会读取属性。 在我当前的场景中,我无法将exec:exec与任何特定的阶段联系起来(这是因为所有其他阶段都有非常具体的作业要处理,而我尝

  • 这些模块是当前ansible附带的,但是也可能在以后被分开.额外模块主要被社区人员维护.非核心模块仍然是完全可用的,但是在发出和拉取请求时可能收到稍微低的响应速率 受欢迎的的 “extras” 模块将来可能会提升为核心模块 这些额外的模块托管在Github上的,`ansible-modules-extras <http://github.com/ansible/ansible-modules-ex

  • 我有一个多项目分级配置,我想添加一个插件到所有子项目和根项目以及。阅读这里的文档似乎很容易: 如果您有一个多项目构建,您可能希望将插件应用于构建中的一些或所有子项目,而不是根项目或主项目。plugins{}块的默认行为是立即解析并应用插件。但是,您可以使用apply false语法告诉Gradle不要将插件应用到当前项目,然后在subprojects块中使用apply plugin:~plugin