如何使 android-app-module 识别和使用 gradle-plugin-module 源

How to make android-app-module identify and use gradle-plugin-module sources

我已经创建了一个独立的插件和一个简单的演示应用程序,我需要它来进行开发。两者都被添加到与 app-模块和 plugin-模块相同的项目中,这样我就可以轻松地开发和测试我在插件中编写的功能。我假设如果我将插件的源添加到 buildSrc/build.gradle.kts,我将能够从应用程序引用插件源(我需要它来构建和应用插件)。完整的演示项目可以在这里找到:https://github.com/oizo/gradle-plugin-sample.

目前,当我在 app/build.gradle.kts 中应用插件时,它似乎可用(自动完成正在工作)但是当我尝试使用 ./gradlew build 构建时,它失败并显示此消息:

FAILURE: Build failed with an exception.

* Where:
Build file '/Users/MyUser/github/gradle-plugin-sample/app/build.gradle.kts' line: 10

* What went wrong:
Script compilation error:

  Line 10: apply<io.hvam.android.plugin.StringPlugin>()
                 ^ Unresolved reference: io

显然,我遗漏了一些东西。

我试过这个post-中提出的解决方案,这似乎是一个类似的问题,但是当我运行 ./gradlew build --include-build plugin/时它也失败了构建,具有以下内容:

FAILURE: Build failed with an exception.

* What went wrong:
Included build in /Users/MyUser/github/gradle-plugin-sample/plugin has a root project whose name 'plugin' is the same as a project of the main build.

我看到两个问题:

  • 您的插件必须以这样一种方式打包,即您的 Plugin 实现 class 作为入口点对插件的消费者可见。一种简单的方法是使用 gradlePlugin {} 块。我建议至少升级到 Gradle 5.5.1 并使用 build init 插件为您自动化所有这些。

    请尝试gradle init --type kotlin-gradle-plugin生成插件项目。这将在您的插件 build.gradle 中添加类似于下面的代码,以确保您的消费者可以使用 apply plugin: "stringPlugin".

  • 应用该插件
gradlePlugin {
   plugins {
     stringPlugin {
         id = "stringPlugin"
         implementationClass = "com.example.StringPlugin"
     }
   }
}
  • 其次,您的插件必须对构建脚本class路径可见,以便它可以应用您的插件。如果您已经将插件发布到 maven,那么您可以在项目级别 build.gradle 添加以下内容,让 gradle 发现您的插件。
buildscript {
    ...
    dependencies {
       classpath "com.example:stringplugin"
    }
}

在开发过程中发布到 maven 可能不方便。您可以利用 Gradle 的 composite builds 在这方面提供帮助。在您的项目级别 settings.gradle,添加以下内容:

includeBuild('./plugin') {
    dependencySubstitution {
        substitute module('com.example:stringplugin') with project(':plugin')
    }
}

这指示 gradle 在请求 com.example:stringplugin 时使用本地存在的 :plugin 模块。这样方便开发。

看来我误解了 gradle 如何使用 buildSrc 文件夹。我已将 buildscript 的内容移动到 buildSrc/build.gradle.kts 中,但省略了实际的 buildscript 扩展名。这以某种方式解决了 app-模块在构建时无法识别 plugin 源的问题。可以查看 int this commit 与修复相关的具体更改。回购协议中的示例代码现在按预期构建。

这更清楚地说明了 buildSrc 文件夹的用途: