覆盖gradle子项目中的存储库定义

覆盖gradle子项目中的存储库定义,gradle,Gradle,假设您有一个带有gradle子项目的gradle构建。 此子项目有一些应用脚本插件,它们定义了自己的存储库,如下所示: buildscript { repositories { //jcenter() maven { url 'https://example.com/plugins.gradle.org/m2/' } } dependencies { classpath 'org.as

假设您有一个带有gradle子项目的gradle构建。 此子项目有一些应用脚本插件,它们定义了自己的存储库,如下所示:

buildscript {
    repositories {
        //jcenter()
        maven {
            url 'https://example.com/plugins.gradle.org/m2/'
        }
    }
    dependencies {
        classpath 'org.asciidoctor:asciidoctor-gradle-plugin:1.5.3'
    }
}
现在假设您只拥有主项目,而不是子项目(它是git子模块)

如何从主项目覆盖子项目的存储库定义

PS:如果您需要更好地描述子项目,请参阅:

更新:我已经创建了一个示例,可以使用:


有关更多详细信息,请参阅自述文件

我只是尝试了一下,但我没有子项目具有构建脚本的项目:

// this lists buildscript repositories:  
getRootProject().getBuildscript().getRepositories().each { repo ->
    println "root: " + repo.getName().toString()
}

// this might list nothing:
subprojects.findAll { project ->
    project.buildscript.getRepositories().each { repo ->
        println "sub: " +  repo.getName().toString()
    }
}

主要问题可能是,这是自顶向下配置的;例如,传递一个命令行参数,该参数将应用一个备用的
buildscript.gradle
块可以工作,但是在子项目范围内更改根项目的配置不会工作。子项目具有自己的
buildscript
块(这些Gradle插件依赖项的行为不同于常规Java依赖项-通常只能决定在何处应用它们),这可能很少见。

正如我在前面的评论中所说,您的情况与问题/请求中描述的情况相同 ,已公开发行相关文件。不幸的是,这个问题还没有解决


我进行了更深入的研究,在我看来,用当前的Gradle版本不可能做到这一点:无法通过注入其他
存储库来“改变”脚本插件的
buildscript
块,因此,Gradle在将此脚本插件应用于子项目之前无法编译它。

我相信我已经为问题中描述的场景找到了解决方案(但请注意下面的警告!)。您可以将以下内容放入根项目的
设置.gradle
文件中:

gradle.allprojects { project ->
    if (project.path == ':subproject') {
        project.buildscript.repositories { repos ->
            all { repo ->
                // filtering by repo name here; you could certainly also use
                // the URL or other properties
                if (repo.name == 'maven') {
                    remove repo
                    // TODO replace with the repo you need here:
                    mavenCentral()
                }
            }
        }
    }
}

如前所述,需要注意的是,这对于脚本插件中的buildscript存储库不起作用,就像您应用于示例GitHub项目的子项目(
apply from:'scripts/AsciiDocBasics.gradle'
)。

我试图将您的(修改过的)代码放入
build.grade
中,但没有成功。
build.gradle
位置正确吗?@rdmueller根项目的
build.gradle
。可能还有其他脚本,为子项目设置
存储库
,这些脚本需要修改。位置甚至不太重要,但它挂接到任务图的位置。可能是另一种选择,因为它们提供了所需的
dependencySubstitution
。请参阅上面的me更新示例代码。我认为主要的问题不是子项目的依赖关系,而是它的插件依赖关系。您试图实现的功能类似于(未解决的)功能请求。不确定Gradle中是否已经实现了一些东西来实现这一点possible@M.Ricciuti我想你是对的——因此,对于有价值的输入,thanx是正确的。如果你把这个作为答案抄下来,我想我可以把赏金分配给你!我不是100%确定这不可能,所以我不会写答案。希望其他人会有一个魔术来帮助你实现这一点。嗨。我有一个更深入的研究,它似乎真的不可能实现。为了帮我解答这个问题,我给每个人写了一封回信!请注意,您不需要从
buildscript
中删除现有存储库,只需添加新的存储库,如果原始存储库无效/无法访问,则将使用新存储库。但正如你所说,这并不能回答问题,因为这里的重点是让应用脚本插件发挥作用。@M.Ricciuti:好吧,之前的原始问题没有提到脚本插件。只有GitHub示例包含脚本插件。这就是我在回答中提到的,因此我说我的回答是在你编辑之前对OP问题的解决方案。我还发布了以前的回答(我已经删除了),因为我也像你一样误解了原始问题背后的真正问题。这就是为什么我对这个问题进行了编辑,让它更清楚。