如何使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
我看到两个问题:
- 您的插件必须以这样一种方式进行打包,即您的
实现类对于插件的消费者是可见的,作为入口点。一种简单的方法是使用插件
block。我建议至少升级到,并使用gradlePlugin{}
plugin为您自动化所有这些 请尝试buildinit
以生成插件项目。这将在您的插件gradleinit——键入kotlin-gradle-plugin
中添加类似于下面的代码,确保您的消费者可以使用build.gradle
应用插件apply plugin:“stringPlugin”
- 其次,您的插件必须对buildscript类路径可见,以便它可以应用您的插件。如果您已经将插件发布到maven,那么您可以在项目级
中添加以下内容,让gradle发现您的插件build.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')
}
}