将本地插件添加到Gradle项目

51

我有一个编译并正常工作的Gradle插件。我想随源代码一起分发一个使用Gradle插件的示例应用程序,这也将使我能够轻松地测试插件的更改。现在要做的是在buildScript块中添加类路径依赖项。是否可以添加一个依赖于本地插件的插件,以便与示例项目一起编译?我现在遇到的主要问题是,在尝试同步示例项目时,插件不存在,导致失败。


如果这是一个演示如何使用插件的示例项目,或者是插件的集成测试,那么为什么不将其依赖于jcenter或gradle插件门户库中的插件呢?为什么必须依赖于本地插件项目? - RaGe
如果这是一个集成测试,你真的应该使用 ProjectBuilder 的方式。 - RaGe
嗯,我想这可能只是一个集成测试,这才是我最终想要完成的目标。我会查看一下这个 ProjectBuilder,并回报进展情况,谢谢。 - Bobbake4
@Bobbake4,你有没有找到一个好的方法来做这件事? - Jared Burrows
5个回答

40

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


话虽如此,我对您发布的文字问题感到好奇,尝试了一些东西。对我有效的是:

buildscript{
    repositories{
        ...
    }

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

apply plugin: fully.qualified.package.PluginClassName
请注意,类名不需要用引号 '括起来变成字符串。
这种声明方式并不是很有用,因为在构建使用插件的项目之前,必须先构建可用的plugin.jar。此时,您可能会依赖于外部存储库依赖项。
第二个问题是,插件项目的传递依赖关系不会自动添加到您的插件消费者项目中。
我无法在buildscript内部使像 classpath project(':plugin-project') 的项目依赖项工作。
确保插件项目始终在构建插件消费者项目之前构建的一种(极其麻烦的)方法是拥有一个“父” build.gradle。 我在这里上传了一个示例。

这是我在网上找到的第一个好答案,但您能否请解释一下如何在检查其他配置之前构建插件?请看一下我的问题https://dev59.com/yqvka4cB1Zd3GeqPv50x - Ben
当我在根目录中添加一个单独的任务buildPluginProject时,它仍然会检查插件是否在其他配置中已经构建。 - Ben
@Ben 我已经两年没有尝试构建我的示例项目了,你能展示一下你的 buildPluginProject 任务吗? - RaGe
1
感谢您的好奇心和花时间研究这个问题。这节省了我一些时间。 - pembeci

18

当我在Android Studio中调试gradle插件时遇到了问题,最终我解决了它。

首先,将您的gradle插件上传到本地maven。

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命令,然后使用本地插件。

buildscript {
    repositories {
        maven {
            url uri('../repo')
        }
    }
    dependencies {
        classpath group: 'com.egos.gradle.plugins',
                  name: 'plugintest',
                  version: '0.0.1'
    }
}

apply plugin: 'com.egos'

1
我如何创建本地的Maven仓库?你能详细说明一下你的答案吗?我只是想使用一个本地插件。 - Guerlando OCs

11

我使用组合构建清晰地解决了这个问题,正如多伦所注意到的。下面是步骤:

  • 用含有groupbuild.gradle定义你的插件:
// some-plugin/build.gradle
...
group = "some.group.id"
...
  • settings.gradle 中如下引用您的项目:
// settings.gradle
...
includeBuild 'some-plugin'
  • 在项目中,您可以通过以下方式使用插件:
// some-project/build.gradle
buildscript {
  dependencies {
    classpath "some.group.id:some-plugin"
  }
}

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

注意类路径是由插件 gradle 文件中定义的组名和其目录名称组成的。


我认为最好提到includeBuild需要插件的路径。无论如何,我这样做时遇到了有关Kotlin版本的错误:https://stackoverflow.com/questions/68189405/plugin-cannot-have-different-kotlin-version-could-not-initialize-class-org-jetb 你有什么想法吗? - Guerlando OCs

9

当前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块。


我做了这个,但是我遇到了Kotlin版本不匹配的问题。本地插件使用了一个版本的Kotlin,而Android应用程序使用了另一个版本。 - Guerlando OCs

3
除了上面的回答之外,您还需要添加 "gradlePlugin" 和 "uploadArchives",类似下面这样:
gradlePlugin {
    plugins {
        testgen {
            id = "com.egos.gradle.plugins"
            implementationClass = "com.egos.gradle.plugins.<PluginClassName>"
        }
    }
}

请将插件类名设置为此,而不是上面的内容。 其余部分与上面的答案相同。谢谢!

为此,我们应该添加 apply plugin: 'java-gradle-plugin'plugins { id 'java-gradle-plugin' } - Aliaksei

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接