gradle - 在某些情况下,仅将插件应用于kotlin脚本gradle,但无法解析插件配置

标签 gradle gradle-kotlin-dsl

我的团队正在将自己的Gradle脚本从Groovy转换为Kotlin,并且我们正在努力用Kotlin脚本gradle复制某些行为。

有时,我们仅在基于CI构建时应用和配置插件。应用不使用的插件没有任何意义。

plugins {
  if (Build.isCi) {
    id("com.google.firebase.appdistribution")
  }
}

但是,当我们在本地进行构建时,由于无法解析插件配置,因此构建脚本中出现错误:
if (Build.isCi) {
  firebaseAppDistribution { // <-- Can't resolve `firebaseAppDistribution`
  }
}

最佳答案

plugins DSL对您可以执行的操作非常严格。对于Kotlin来说尤其如此,因为它是在后台静态键入和编译的。

我相信您将需要执行以下操作:

plugins {
    id("com.google.firebase.appdistribution") apply false
}

这应确保Firebase插件的相关扩展/类在构建脚本类路径上。

然后稍后在构建脚本中的某处,实际应用并配置插件:
plugins {
    id("com.google.firebase.appdistribution") apply false
}

if (Build.isCi) {
    apply(plugin = "com.google.firebase.appdistribution")
    configure<FirebaseAppDistributionExtension> {
        // ...
    }
}

我不知道firebaseAppDistribution的实际类型/类,所以我以FirebaseAppDistributionExtension为例。您将需要找出扩展的具体类型并将其用作类型。

引用文献:
  • https://docs.gradle.org/current/dsl/org.gradle.plugin.use.PluginDependenciesSpec.html(用于apply false说明的底部)
  • https://docs.gradle.org/current/userguide/kotlin_dsl.html#sec:kotlin_using_standard_api
  • 关于gradle - 在某些情况下,仅将插件应用于kotlin脚本gradle,但无法解析插件配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60833874/

    相关文章:

    android - 如何使用 Kotlin DSL 将选项传递给 JavaPluginExtension

    android - 错误:找不到符号 “this.setSupportActionBar(toolbar);”。我该如何解决?

    gradle - Gradle测试任务testReport任务-Gradle 2.3/Java7或Java8不推荐使用的属性

    maven - 如何配置 Gradle 以查找本地 SNAPSHOT 资源?

    gradle - 无法解析 'kotlin'中的 '/home/marcin/Projects/EduKotlinAcademy/web/build/node_modules_imported/kotlinx-html-js'

    Gradle:具有可变输入的任务

    android - 如何在 gradle.kts 中设置全局变量?

    kotlin - 为什么在 build.gradle.kts 中不能使用 `const val`

    gradle - Kotlin Gradle DSL 在运行单元测试时排除验收测试

    gradle - 为什么我无法使用 Gradle Kotlin DSL (5.0) 访问 build.gradle.kts 的 "plugins"部分中的项目属性?