包括一个具有相同插件依赖关系的第三方子项目

时间:2019-09-06 04:07:57

标签: gradle git-submodules

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

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

通常,我会将我的项目打补丁以解决这种不兼容性,但是由于构建脚本未通过验证,因此这显然不是一种选择。鉴于我实际上无法控制子项目的构建脚本,该怎么办才能解决冲突?

2 个答案:

答案 0 :(得分:0)

in this thread所述,补丁仍然可能是可行的(因为官方Gradle documentation on plugin并未涵盖):

目前,我可以想到2种“解决方法”:

  

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

buildscript {
  repositories {
    maven {
      url "https://plugins.gradle.org/m2/"
    }
  }
  dependencies {
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.31"
  }
}

def kotlinPluginId = 'org.jetbrains.kotlin.multiplatform'
final hasPlugin = project.getPlugins().hasPlugin(kotlinPluginId);
if (hasPlugin) {
    final Plugin plugin = project.getPlugins().getPlugin(kotlinPluginId)
    println 'Plugin already applied - version ' + plugin.properties['kotlinPluginVersion']
} else {
    apply plugin: "org.jetbrains.kotlin.multiplatform"
}

OR:

  

2 /为独立项目创建一个虚拟根项目,并在其中为子项目使用plugins {}块。在这种情况下,子项目将没有任何逻辑可以应用插件。

答案 1 :(得分:0)

我有一个类似的问题,我想包含一个模块,该模块也应该能够自行构建。更精确地讲,我想要包含的模块也声明了com.github.johnrengelman.shadow来生成可运行的JAR。这导致产生两个 build.gradle 文件,声明该插件带有版本号。

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

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

includeBuild "../submodule"

然后,您可以在顶级 build.gradle 中将子模块定义为常规依赖项:

dependencies {
    implementation 'com.mycompany:submodule:1.0-SNAPSHOT'
}