gradle配置是合并还是覆盖?

时间:2015-03-31 19:00:34

标签: gradle

假设我定义了一个插件,如下所示:

import org.gradle.api.artifacts.dsl.RepositoryHandler
import org.gradle.api.artifacts.repositories.MavenArtifactRepository
import org.gradle.api.Project
import org.gradle.api.Plugin

class MyRepos implements Plugin<Project> {
    static final String NEXUS_URL = 'http://nexus.mine.com/nexus/content/repositories/'
    static final List<String> NEXUS_REPOS = [
        'central',
        'build',
        'snapshots',
        'release-candidates',
        'releases',
    ]

    void apply(Project project) {
        project.repositories {
            NEXUS_REPOS.each {
                maven {
                    url (NEXUS_URL + it)
                }
            }
            mavenLocal()
        }
        project.buildscript {
            repositories {
                maven {
                    url (NEXUS_URL + 'central')
                }
                mavenLocal()
            }
        }
    }
}

在本地build.gradle中,我写了

apply plugin: MyRepos

buildscript {
    dependencies {
       ...
    }
}

我的愿望是合并两个buildscript部分,以便在插件和build.gradle中的依赖项中定义存储库,但看起来本地声明会覆盖插件,最终会出现错误,指示& #34;没有定义存储库&#34;。

如果我是通过顶层build.gradle的配置注入来完成的,结果是否相同?

也许正确的解决方案是插件提供一个ext闭包来定义useMyRepos(),类似于mavenCentral()的使用方式......

1 个答案:

答案 0 :(得分:1)

通常合并gradle中的配置项,以便您可以在不同位置应用配置。例如,您可以在一个构建脚本中配置一些依赖项,这些依赖项将应用于将添加其他依赖项的另一个构建脚本。

但是,您的情况稍有不同,因为您正在使用buildScript配置,这可用于定义构建脚本本身的依赖关系,而不是根repositories节点。用于定义您构建的项目的依赖关系。

在这种情况下,根据Purpose of buildScript in Gradle,因为这些是不同的配置,您必须两次定义您的依赖关系。