如何使android应用程序模块识别和使用gradle插件模块源

如何使android应用程序模块识别和使用gradle插件模块源,android,gradle,plugins,build,gradle-plugin,Android,Gradle,Plugins,Build,Gradle Plugin,我已经创建了一个独立的插件和一个简单的演示应用,我需要开发。两者都作为应用程序-模块和插件-模块添加到同一个项目中,因此我可以轻松开发和测试我在插件中编写的功能。我假设如果我将插件中的源代码添加到buildSrc/build.gradle.kts,我将能够引用应用程序中的插件源代码(我需要它来构建和应用插件)。整个演示项目可在此处找到: 目前,当我在app/build.gradle.kts中应用插件时,它似乎是可用的(自动完成正在工作),但当我尝试使用/gradlew build进行构建时,它失

我已经创建了一个独立的插件和一个简单的演示应用,我需要开发。两者都作为
应用程序
-模块和
插件
-模块添加到同一个项目中,因此我可以轻松开发和测试我在插件中编写的功能。我假设如果我将插件中的源代码添加到
buildSrc/build.gradle.kts
,我将能够引用应用程序中的插件源代码(我需要它来构建和应用插件)。整个演示项目可在此处找到:

目前,当我在
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
我看到两个问题:

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

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

  • 其次,您的插件必须对buildscript类路径可见,以便它可以应用您的插件。如果您已经将插件发布到maven,那么您可以在项目级
    build.gradle
    中添加以下内容,让gradle发现您的插件
在开发过程中,发布到maven可能不方便。在这方面,你可以利用Gradle的帮助。在项目级别
设置.gradle
中,添加以下内容:

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

这指示gradle在请求
com时使用本地存在的
:plugin
模块。例如:stringplugin
。这将便于开发。

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


这使
buildSrc
文件夹的用途更加明确:

感谢您的回复。关于使用
gradlePlugin
的第一点似乎只是添加
META-INF
properties文件的脚本化方法,没有任何帮助。我曾经设法让它运行,通过将
buildscript
移动到
buildSrc/build.gradle.kts
,但省略了实际的
buildscript
扩展。在这里,您可以回顾一下为我带来了诀窍的具体更改:依赖项替换的部分非常有趣,我一定要看一下。
gradlePlugin {
   plugins {
     stringPlugin {
         id = "stringPlugin"
         implementationClass = "com.example.StringPlugin"
     }
   }
}
buildscript {
    ...
    dependencies {
       classpath "com.example:stringplugin"
    }
}
includeBuild('./plugin') {
    dependencySubstitution {
        substitute module('com.example:stringplugin') with project(':plugin')
    }
}