【问题标题】:Adding local plugin to a Gradle project将本地插件添加到 Gradle 项目
【发布时间】:2016-02-09 21:21:27
【问题描述】:

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

【问题讨论】:

  • 如果它是一个示例项目来演示如何使用插件,或者它是一种插件的集成测试?如果是前者,为什么不依赖于来自 jcenter 的插件或 gradle plugins 门户仓库?为什么一定要依赖本地插件项目?
  • 如果是集成测试,你真的应该采用ProjectBuilder 方式
  • 嗯我想这可能只是一个集成测试,这最终是我想要完成的。我会检查一下这个 ProjectBuilder 并报告它的进展情况,谢谢。
  • @Bobbake4 你有没有找到这样做的好方法?

标签: java gradle


【解决方案1】:

如果编写集成测试是您的最终目标,我仍然建议使用 ProjectBuilder。你可以在Section 39.5.4 here 中看到一个这样的例子。 gradle 源代码中有更多真实世界的测试实现示例。 See here for instance.


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

buildscript{
    repositories{
        ...
    }

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

apply plugin: fully.qualified.package.PluginClassName

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

这不是很有用,因为此声明要求在构建使用插件的项目之前构建 plugin.jar 并使其可用 - 但此时,您可能还依赖于外部 repo 依赖项。

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

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


在构建插件消费者项目时确保插件项目始终构建并可用的一种(非常hacky)方法是拥有一个“父” build.gradle,它始终在构建消费者项目之前首先构建插件。我uploaded an example here

【讨论】:

  • 这是我在网上找到的第一个很好的答案,但是在检查其他配置之前,您能解释一下如何构建插件吗?看看我的问题stackoverflow.com/questions/50494708/…
  • 当我在 root 中添加一个单独的任务 buildPluginProject 时,它仍然会检查插件是否内置在其他配置中
  • @Ben 自从我在 2 年前编写示例项目以来,我一直没有尝试构建它,你能展示你的 buildPluginProject 任务吗?
  • 感谢您成为古玩并花时间研究这个答案。它为我节省了几个小时。
【解决方案2】:

遇到想在Android Studio中调试我的gradle plugin,终于解决了。

首先,将您的 gradle plugin 上传到本地 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'

【讨论】:

  • 如何创建本地 maven 存储库?你能详细说明你的答案吗?我只是想使用本地插件
【解决方案3】:

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

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

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

IDE 也支持此功能: Simple instructions for configuring Composite Build in IntelliJ

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

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

【讨论】:

  • 我这样做了,但我得到了一个 kotlin 版本不匹配。本地插件使用一个版本的 kotlin,而 android 应用使用另一个版本。
【解决方案4】:

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

  • 使用具有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 版本的错误:stackoverflow.com/questions/68189405/… 你有什么想法吗?
【解决方案5】:

除了上面的答案。您还需要添加“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' }
猜你喜欢
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
  • 2022-10-15
  • 1970-01-01
  • 1970-01-01
  • 2016-05-16
  • 2014-08-23
  • 2019-10-04
相关资源
最近更新 更多