关于Java:将本地插件添加到Gradle项目

Adding local plugin to a Gradle project

我有一个Gradle插件,可以按预期进行编译和工作。 我想在源代码中分发一个使用Gradle插件的示例应用程序,这也使我可以轻松地测试对该插件的更改。 现在要执行此操作,我必须将类路径依赖项添加到buildScript块中。 是否可以添加将与示例项目一起编译的从属本地插件? 我现在遇到的主要问题是,尝试同步示例项目导致失败时,该插件不存在。


如果编写集成测试是您最终的目标,我仍然建议使用ProjectBuilder。您可以在此处的39.5.4节中看到一个示例。 gradle源代码中有更多实际测试实现示例。例如参见这里。

话虽如此,我对您发布的字面问题感到好奇,并尝试了一些尝试。对我有用的是:

1
2
3
4
5
6
7
8
9
10
11
buildscript{
    repositories{
        ...
    }

    dependencies{
        classpath files('relative/path/to/plugin.jar')
    }
}

apply plugin: fully.qualified.package.PluginClassName

请注意,类名称未包含在' quotes '中,以使其成为字符串。

这不是很有用,因为此声明要求在构建使用该插件的项目之前先构建plugin.jar并将其可用-但在这一点上,您可能还取决于外部回购依赖项。

第二个问题是插件项目的传递依赖项不会自动添加到您的插件用户项目中。

我无法在buildscript中使用像classpath project(':plugin-project')这样的项目依赖项。

确保插件项目在构建插件用户项目时始终可以构建并可用的一种(极其hacky)方式是拥有一个"父" build.gradle,该父对象始终在构建消费者项目之前首先构建插件。我在这里上传了一个例子。


当我想在Android Studio中调试gradle plugin时遇到了问题,我终于解决了。

首先,将您的gradle plugin上传到本地Maven。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
apply plugin: 'java'
apply plugin: 'groovy'
apply plugin: 'maven'

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile gradleApi()
}

sourceCompatibility ="1.7"
targetCompatibility ="1.7"


group='com.egos.gradle.plugins'
name='plugintest'
version='0.0.1'

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: uri('../repo'))
        }
    }
}

执行gradle uploadArchives。然后使用本地插件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
buildscript {
    repositories {
        maven {
            url uri('../repo')
        }
    }
    dependencies {
        classpath group: 'com.egos.gradle.plugins',
                  name: 'plugintest',
                  version: '0.0.1'
    }
}

apply plugin: 'com.egos'

在当前的Gradle版本(撰写本文时为3.3)中,您可以使用Composite Build功能来替代插件依赖项。

例如,您可以使用以下命令构建示例项目(在示例项目的根目录中运行):
gradle build --include-build /path/to/local-plugin

这将从本地目录中提取您的插件。它甚至会首先构建您的插件,然后使用刚刚构建的插件作为依赖项来构建示例项目。

IDE也支持此功能:
在IntelliJ中配置Composite Build的简单说明

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

注意,替换插件仅适用于buildscript块,而不适用于plugins块。


正如Doron所注意到的,找到了一种使用复合材料构建的干净方法。这些步骤是:

  • 使用具有groupbuild.gradle定义您的插件:
1
2
3
4
// some-plugin/build.gradle
...
group ="some.group.id"
...
  • 像这样在settings.gradle中引用您的项目:
1
2
3
// settings.gradle
...
includeBuild 'some-plugin'
  • 在您的项目中,您可以通过以下方式使用插件:
1
2
3
4
5
6
7
8
// some-project/build.gradle
buildscript {
  dependencies {
    classpath"some.group.id:some-plugin"
  }
}

apply(plugin:"your.plugin.id")

注意,如何通过插件的gradle文件及其目录名称中定义的组来创建类路径。


除了上述答案。您还需要添加" gradlePlugin"和" uploadArchives",如下所示:

1
2
3
4
5
6
7
8
gradlePlugin {
    plugins {
        testgen {
            id ="com.egos.gradle.plugins"
            implementationClass ="com.egos.gradle.plugins.<PluginClassName>"
        }
    }
}

而不是为此设置您的插件类名。
其余与上述答案相同。谢谢!