Как применить плагин 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);
// ...
}
// ...
}