Как применить плагин Gradle от другого плагина?

Я пытаюсь инкапсулировать плагин 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

Я предполагаю, что в то время, когда вы хотели бы добавить зависимостей плагина для сборки script, были уже решены, таким образом, это не сработает. Вам нужно указать плагин, который вы хотели бы применить в качестве самой зависимости script.

Он будет работать следующим образом:

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 был применен ранее и возник конфликт.

Ответ 2

Используйте проект PluginManager. Например, плагин war извлекает плагин java следующим образом:

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