Gradle Kotlin DSL:子项目和插件的问题

Gradle Kotlin DSL: Problems with subprojects and plugins

Gradle6.1.1

我一直在尝试使用 Kotlin DSL 转换我的项目的 gradle 文件,但到目前为止失败了。我的所有项目都是 Java 中的多项目构建。 我遵循了插件子项目示例 here

看起来是这样的:

plugins {
    idea
    eclipse
}

subprojects {
    apply(plugin = "java")

    dependencies {
       implementation("com.google.guava:guava:28.1-jre")
       //...
    }
}

java 插件在子项目中似乎不被理解,所有 'implementation' 行都得到未解决的引用。

在此处查看文档 https://docs.gradle.org/current/userguide/kotlin_dsl.html

Type-safe accessors are unavailable for model elements contributed by the following:

  • Plugins applied via the apply(plugin = "id") method
  • ...
 implementation()

就是这样一个类型安全的访问器。非类型安全方式如下所示:

    apply(plugin = "java-library")
    dependencies {
        "api"("javax.measure:unit-api:1.0")
        "implementation"("tec.units:unit-ri:1.0.3")
    }

使用 groovy DSL,所有方法都是动态解析的(不是类型安全的),所以没关系。

有助于理解 build.gradle.kts 文件不是纯 kotlin 文件。如果顶部有大量进口产品,它们看起来会更难看。所以 gradle 运行 时间将“buildscript”和“plugins”块特殊对待。 “插件”被转换为导入语句。这不适用于 apply() 方法,该方法稍后在文件编译时 运行 。这也是为什么 plugins 块不能在其他地方使用的原因,它是一个特殊的构造,只是伪装成一个普通的代码块。这里有更多细节 https://docs.gradle.org/current/dsl/org.gradle.plugin.use.PluginDependenciesSpec.html

建议

仅从模块设计的角度来看,我通常建议多模块构建中的根模块对子模块的作用保持未知,即使有很多人使用 subprojects 块作为示例做。让每个子模块的构建文件都像一个独立的 gradle 项目一样完整,这样读者就不必阅读 2 个文件来了解全貌。

有更好的明确方式在子项目之间共享配置。

根文件中的 subprojects 块最好用于添加额外的任务,如果它们需要来自项目的根,IMO。不注入插件或配置。