【问题标题】:How to make android-app-module identify and use gradle-plugin-module sources如何让 android-app-module 识别和使用 gradle-plugin-module 源
【发布时间】:2020-02-17 10:44:56
【问题描述】:

我创建了一个独立插件以及一个简单的演示应用程序,这是我开发时需要的。两者都作为app-module 和plugin-module 添加到同一个项目中,这样我就可以轻松地开发和测试我在插件中编写的功能。我假设如果我将插件中的源添加到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

很明显,我错过了一些东西。

我已经尝试过这篇帖子中提出的解决方案-https://stackoverflow.com/a/42263532/1181023,这似乎是一个类似的问题,但是当我运行./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.

【问题讨论】:

    标签: android gradle plugins build gradle-plugin


    【解决方案1】:

    我看到两个问题:

    • 您的插件必须以这样一种方式打包,即您的Plugin 实现类对于插件的消费者是可见的作为入口点。一种简单的方法是使用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"
         }
       }
    }
    
    • 其次,您的插件必须对 buildscript 类路径可见,以便它可以应用您的插件。如果您已经将插件发布到 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 模块。这样方便开发。

    【讨论】:

    • 感谢您的回复。关于使用gradlePlugin 的第一点似乎只是添加META-INF 属性文件的脚本方式,并没有帮助。我通过将buildscript 移动到buildSrc/build.gradle.kts 来设法让它运行,但省略了实际的buildscript 扩展名。您可以在此处查看对我有用的具体更改:github.com/oizo/gradle-plugin-sample/commit/… 依赖替换部分非常有趣,我一定要看看。
    【解决方案2】:

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

    这使buildSrc 文件夹的用途更加清晰:https://stackoverflow.com/a/13875350/1181023

    【讨论】:

      猜你喜欢
      • 2015-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-29
      • 1970-01-01
      • 2015-03-19
      • 2021-04-15
      • 1970-01-01
      相关资源
      最近更新 更多