将本地插件添加到Gradle项目

时间:2016-02-09 21:21:28

标签: java gradle

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

5 个答案:

答案 0 :(得分:18)

如果编写集成测试是您的最终目标,我仍然建议您使用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

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

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

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

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

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

答案 1 :(得分:13)

当我想在Android Studio中调试我的int rowIndex = 0; int firstCellInRow = 0; int cellCount = listOfResults.size(); int cellsPerRow = 7; int rowCount = cellCount / cellsPerRow; for (int i = 0; i < rowCount; i++) { // detect first header cell firstCellInRow = i * cellsPerRow; if (listOfResults.get(firstCellInRow).equals("S.NO")) { // create a new sheet sheet = wb.createSheet(); // reset the row index to 0 rowIndex = 0; } // create the row and increment the row index row = sheet.createRow(rowIndex++); // now add the data to the cells for (int j = 0; j < cellsPerRow; j++) { cell = row.createCell(j); if (firstCellInRow + j < listOfResults.size()) { cell.setCellValue(listOfResults.get(firstCellInRow + j)); } } } 时遇到这种情况,我终于解决了。

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

gradle plugin

执行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

答案 2 :(得分:4)

使用当前的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块,但不适用于插件块。

答案 3 :(得分:2)

除上述答案外。你还需要添加“gradlePlugin”和“uploadArchives”,如下所示:

gradlePlugin {
    plugins {
        testgen {
            id = "com.egos.gradle.plugins"
            implementationClass = "com.egos.gradle.plugins.<PluginClassName>"
        }
    }
}

而不是这个设置你的插件类名。 休息与上述答案相同。谢谢!

答案 4 :(得分:0)

找到了一种干净的方法来处理复合建筑,正如Doron所注意到的那样。这些步骤是:

  • 使用具有build.gradle的{​​{1}}定义插件:
group
  • 像这样在// some-plugin/build.gradle ... group = "some.group.id" ... 中引用您的项目:
settings.gradle
  • 在您的项目中,您可以通过以下方式使用插件:
// settings.gradle
...
includeBuild 'some-plugin'

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