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。不注入插件或配置。
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。不注入插件或配置。