繁体   English   中英

将Android Gradle插件添加为运行时依赖项

[英]Add Android Gradle plugin as a runtime dependency

我正在编写适用于Android的Gradle插件,该插件使用新的Transform API 不幸的是,我在将Android插件添加为插件的依赖项时遇到了问题。 我的插件的简化Gradle配置如下所示:

plugin / build.gradle

apply plugin: "groovy"

dependencies {
    compile gradleApi()
    compile localGroovy()
    compile "com.android.tools.build:gradle:1.4.0-beta2"
}

这是使用我的Gradle插件的应用程序项目的简化配置:

application / build.gradle

buildscript {
    dependencies {
        classpath "com.android.tools.build:gradle:1.4.0-beta2"
        classpath "my-plugin:my-plugin:1.0.0"
    }
}

apply plugin: "com.android.application"
apply plugin: "my-plugin"

android {
    compileSdkVersion 23
    buildToolsVersion '23.0.1'

    defaultConfig {
        applicationId 'com.myapplication'
        minSdkVersion 16
        targetSdkVersion 23
        versionCode 1
        versionName version
    }
}

使用此配置,一切正常,但我也希望我的插件能够与使用早期版本的Android插件的项目正常工作。 因此,我尝试在应用程序的配置文件中更改Android插件版本:

application / build.gradle(带有Android插件1.3.1)

buildscript {
    dependencies {
        classpath "com.android.tools.build:gradle:1.3.1"
        classpath "my-plugin:my-plugin:1.0.0"
    }
}

/* Everything else is the same. */

但在这种情况下,仍将使用Android插件1.4.0-beta2 我相信这是因为Gradle解决了类路径依赖关系时,它比1.3.1更喜欢1.4.0-beta2 ,因此整个项目开始使用Android插件的1.4.0-beta2版本。

我还尝试将Android插件添加为runtime依赖项,但是在进行此更改后,由于“无法解决”这样的错误,我的插件停止了编译:

Unable to resolve class com.android.build.gradle.api.BaseVariant @ line 19, column 1.
import com.android.build.gradle.api.BaseVariant

有没有一种方法可以针对最新版本的Android插件构建我的插件,但在运行时使用由构建环境提供的Android插件版本?

最后,我设法通过手动添加provided范围来解决此问题。 这是一篇有关将provided范围添加到Gradle的很好的文章: http : //www.sinking.in/blog/provided-scope-in​​-gradle/ 不幸的是,它没有说明如何使maven-publish插件处理provided范围。 因此,我将解释如何做到这一点。

在我的项目中,我在buildSrc中有一个小插件,负责发布到Maven。 我将所有provided相关代码添加到了此插件,但可以将其添加到build.gradle文件中。

插件框架如下所示:

class PublishPlugin implements Plugin<Project> {
    private static final PROVIDED_CONFIGURATION_NAME = "provided"

    private Project project

    @Override
    void apply(final Project project) {
        project.apply plugin: 'java'
        project.apply plugin: 'maven-publish'
        project.apply plugin: 'com.jfrog.bintray'
        project.apply plugin: 'idea'

        addProvidedConfiguration()
        configureIdeaModule()

        project.afterEvaluate {
            modifyPomDependencyScopes()
        }
    }

然后,我们创建一个provided范围。 可以在编译期间使用添加到此范围的依赖项。 在生成的pom.xml文件中,这些依赖项将provided作用域。

    private void addProvidedConfiguration() {
        final Configuration provided =
                addConfiguration(project.configurations,
                        PROVIDED_CONFIGURATION_NAME)
        final Javadoc javadoc =
                project.tasks.getByName(JavaPlugin.JAVADOC_TASK_NAME) as Javadoc
        javadoc.classpath = javadoc.classpath.plus(provided)
    }

    private static Configuration addConfiguration(
           final ConfigurationContainer configurations, final String name) {
        final Configuration compile =
                configurations.getByName(JavaPlugin.COMPILE_CONFIGURATION_NAME)
        final Configuration configuration = configurations.create(name)

        compile.extendsFrom(configuration)
        configuration.visible = false
        configuration.transitive = false

        configuration.allDependencies.all { final dependency ->
            configurations.default.exclude(
                    group: dependency.group, module: dependency.name)
        }

        return configuration
    }

我使用IntelliJ IDEA,因此需要使其“了解”所provided范围。 如果使用Eclipse,则必须执行相同的操作。

    private void configureIdeaModule() {
        project.idea.module {
            scopes.PROVIDED.plus += [project.configurations.provided]
        }
    }

最后,我们需要在生成的pom.xml文件中更改范围。 默认情况下,Gradle将所有依赖项的作用域设置为runtime 并且以下代码将它们更改为可compile或在必要时provided

    private void modifyPomDependencyScopes() {
        modifyPomDependencyScope(JavaPlugin.COMPILE_CONFIGURATION_NAME)
        modifyPomDependencyScope(PROVIDED_CONFIGURATION_NAME)
    }

    private void modifyPomDependencyScope(final String scope) {
        project.publishing.publications.all {
            pom.withXml {
                final DependencySet dependencies =
                        project.configurations.getByName(scope).allDependencies
                asNode().dependencies.'*'.findAll() {
                    dependencies.find { it.name == node.artifactId.text()
                }.each { it.scope*.value = scope }
            }
        }
    }
}

而已。 然后,您只需要将此插件应用于需要发布到Maven的项目,并将依赖项类型从compile更改为provided

apply plugin: "groovy"
apply plugin: "my-publish-plugin"

dependencies {
    compile gradleApi()
    compile localGroovy()
    provided "com.android.tools.build:gradle:1.4.0-beta2"
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM