如何使 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
文件夹的用途:
我已经创建了一个独立的插件和一个简单的演示应用程序,我需要它来进行开发。两者都被添加到与 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
文件夹的用途: