如何正确添加 gradle 插件到多项目?

How to properly add gradle plugin to multiproject?

我有一个多项目build.gradle: https://gist.github.com/iva-nova-e-katerina/7c72399ede83b5f78dbae19582974f35

并且此脚本因错误而失败:

> Plugin with id 'com.github.blindpirate.osgi' not found.

为什么?也许 buildscript {} 应该在 allprojects 之外?如何正确添加 gradle 插件到多项目?

按照您的建议,您可以通过将 buildscript 移到 allprojects 之外来解决此问题。例如

buildscript {
    repositories {
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }
    dependencies {
        classpath "gradle.plugin.com.github.blindpirate:gradle-legacy-osgi-plugin:0.0.4"
    }
}

subprojects {
    apply plugin: "com.github.blindpirate.osgi"
}

Gradle docs:

解释了这个工作的原因

For multi-project builds, the dependencies declared with a project’s buildscript() method are available to the build scripts of all its sub-projects.

当有人在官方论坛上提问 similar question 时,Gradle 也推荐了这种方法。

现在回答你的问题如何正确地将 gradle 插件添加到多项目?。有一个更好的方法来应用 gradle-legacy-osgi-plugin 插件,即使用插件 DSL,例如

plugins {
  id "com.github.blindpirate.osgi" version "0.0.6"
}

使用插件 DSL 比您当前使用的 apply 语法有一些 significant advantages,因此通常是推荐的方法。

由于您在多项目设置中工作,插件 DSL 将与您当前使用的 subprojects 语法不兼容。我建议采用以下方法之一:

  1. 在有版本的根项目中应用插件,然后在没有版本的子项目中应用插件。使用 apply false 来避免插件被应用到根项目。 docs 有一个完整的例子。
plugins {
    id "com.github.blindpirate.osgi" version "0.0.6" apply false
}
  1. 创建一个 convention plugin 并将其应用于每个子项目

不鼓励使用 allprojectssubprojects 语法,因为它会将项目耦合在一起,从而导致并行构建执行等功能出现问题。使用上述建议可以帮助您避免这种遗留语法。

似乎应该在每个子项目的 build.gralde 中应用插件,而不是在根的“subprojects {”元素中应用。如这里

git clone github.com/bobbylight/RSyntaxTextArea.git

(插件: "biz.aQute.bnd.builder")