包含具有相同插件依赖项的 3rd-party 子项目

cas*_*eif 6 gradle git-submodules

我试图将 Git 子模块作为子项目包含在我的主要 Gradle 项目中,但 Gradle 拒绝验证构建脚本,理由是我的项目和子项目都需要相同的插件 ( "Plugin request for plugin already on the classpath must not include a version")。

从主项目中删除插件不是一个选项,因为插件定义的任务将不再可用于主构建脚本。也不会从主构建脚本中省略插件版本,因为这是 Gradle 看到的插件声明的第一个实例(而错误是在子项目的声明中抛出的)。

通常我会让我的项目修补这种不兼容性,但由于构建脚本没有验证,这显然不是一个选项。鉴于我实际上无法控制子项目的构建脚本,可以做些什么来解决冲突?

chr*_*set 7

我有一个类似的问题,我想包含一个也应该能够自己构建的模块。更准确地说,我想包含的模块也声明com.github.johnrengelman.shadow用于生成可运行的 JAR。这导致两个build.gradle文件使用版本号声明此插件。

解决方案是使用Composite Build。这导致模块的构建完全独立,能够声明任何版本的插件。

你所要做的就是添加includeBuild "<pathToSubmodule>"你的根settings.gradle

includeBuild "../submodule"
Run Code Online (Sandbox Code Playgroud)

然后,您可以在顶层build.gradle 中将子模块定义为普通依赖

dependencies {
    implementation 'com.mycompany:submodule:1.0-SNAPSHOT'
}
Run Code Online (Sandbox Code Playgroud)


Von*_*onC 0

不过,补丁可能仍然是可以想象的,如本线程中所述(因为插件的官方 Gradle 文档未涵盖它):

\n\n

目前,我能想到2 \xe2\x80\x9cworkarounds\xe2\x80\x9d:

\n\n
\n

1/ 在您的子项目中,不要使用块应用plugins{},而是使用旧插件应用程序有条件地应用插件。
\n这是我使用的方法:

\n\n
buildscript {\n  repositories {\n    maven {\n      url "https://plugins.gradle.org/m2/"\n    }\n  }\n  dependencies {\n    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.31"\n  }\n}\n\ndef kotlinPluginId = \'org.jetbrains.kotlin.multiplatform\'\nfinal hasPlugin = project.getPlugins().hasPlugin(kotlinPluginId);\nif (hasPlugin) {\n    final Plugin plugin = project.getPlugins().getPlugin(kotlinPluginId)\n    println \'Plugin already applied - version \' + plugin.properties[\'kotlinPluginVersion\']\n} else {\n    apply plugin: "org.jetbrains.kotlin.multiplatform"\n}\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n

或者:

\n\n
\n

2/ 为独立项目创建一个虚拟根项目,并为子项目使用plugins{} 块。在这种情况下,子项目不会\xe2\x80\x99t有任何逻辑来应用插件。

\n
\n