如何从另一个插件中应用Gradle插件?

16

我正试图将Android插件封装在我的自己的插件中,但是当我尝试应用我的插件时,构建失败并出现异常:

我正在尝试在我的插件中封装 Android 插件,但是当我尝试应用我的插件时,构建失败了并出现了一个异常:

A problem occurred evaluating root project 'myproj'.
> Failed to apply plugin [id 'com.mycomp.build']
  > Failed to apply plugin [id 'android-library']
    > Plugin with id 'android-library' not found.

这是我如何在自己的插件实现中应用Android插件:

// build.gradle
apply plugin: 'groovy'

version = '1.0'
group = 'com.mycomp'

dependencies {
    compile gradleApi()
    compile localGroovy()
}

// Build.groovy
package com.mycomp

import org.gradle.api.Plugin
import org.gradle.api.Project

class Build implements Plugin<Project> {
    void apply(Project project) {
        println 'Hello from com.mycomp.Build'
        project.beforeEvaluate {
            buildscript.configurations.classpath += 
                'com.android.tools.build:gradle:1.0.0-rc1'
        }

        project.configure(project) {
            buildscript.repositories.mavenCentral()
            apply plugin: 'android-library'
        }
    }
}

由于某些原因,类路径未被正确加载,我做错了什么?


1
请不要在这里和http://forums.gradle.org上重复发布。 - Peter Niederwieser
2个回答

11

我猜你想为构建脚本添加插件依赖时,已经解析了依赖关系,因此这种做法行不通。你需要将要应用的插件自身作为脚本依赖项来指定。

如下所示即可:

buildscript {
   repositories {
      mavenCentral()
   }

   dependencies {
      classpath 'com.android.tools.build:gradle:1.0.0-rc1'
   }
}


apply plugin: 'groovy'
apply plugin: Build

version = '1.0'
group = 'com.mycomp'

dependencies {
    compile gradleApi()
    compile localGroovy()
}

import org.gradle.api.Plugin
import org.gradle.api.Project

class Build implements Plugin<Project> {
    void apply(Project project) {
        project.configure(project) {
            apply plugin: 'android-library'
        }
    }
}

现在,发现了android-plugin,但它失败了,因为groovy插件已经被应用,存在冲突。


9

使用项目的PluginManager。例如,war插件用以下方式引入java插件:

public class WarPlugin implements Plugin<Project> {
    // ...
    public void apply(final Project project) {
        project.getPluginManager().apply(org.gradle.api.plugins.JavaPlugin.class);
        // ...
    }
    // ...
}

7
如果您想应用一个第三方的插件(给定groupId/version),是否可以使用这种方法?在没有拥有该插件的情况下,此方法是否仍然有效?我是否只需将其声明为我的插件项目的常规依赖项?请注意,翻译后不包含解释或其他额外内容。 - Joffrey
我想是的。只要您可以导入插件类,那么就没问题了。 - Emil Lundberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接