在Gradle构建中定义Maven存储库之后,如何用本地目录替换它?

在Gradle构建中定义Maven存储库之后,如何用本地目录替换它?,gradle,Gradle,我试图为构建过程编写测试,因此我的单元测试希望用本地位置替换实际的存储库位置,以避免毒害真正的服务器。(另外,我想,运行测试的人可能无论如何都没有发布的权限。) 在构建本身中: publishing { repositories { maven { name = 'snapshot' url = "${artifactory_contextUrl}/libs-snapshot-local" crede

我试图为构建过程编写测试,因此我的单元测试希望用本地位置替换实际的存储库位置,以避免毒害真正的服务器。(另外,我想,运行测试的人可能无论如何都没有发布的权限。)

在构建本身中:

publishing {
    repositories {
        maven {
            name = 'snapshot'
            url = "${artifactory_contextUrl}/libs-snapshot-local"
            credentials {
                username artifactory_user
                password artifactory_password
            }
        }

        maven {
            name = 'release'
            url = "${artifactory_contextUrl}/libs-release-local"
            credentials {
                username artifactory_user
                password artifactory_password
            }
        }
    }
}
在我的测试构建中,我试图用以下内容覆盖它:

publishing {
    repositories {
        getByName('snapshot') {
            url = uri('/tmp/local-repo/snapshots')
        }
        getByName('release') {
            url = uri('/tmp/local-repo/release')
        }
    }
}
当我尝试运行构建时,我得到:

Execution failed for task ':publishMavenJavaPublicationToReleaseRepository'.
> Failed to publish publication 'mavenJava' to repository 'release'
   > Authentication scheme 'all'(Authentication) is not supported by protocol 'file'
网络上有很多关于这个特定错误的帖子,但似乎总是有人在本应该放URI的时候意外地放了一个文件路径。不过,我有意地输入了一个URI,那么有没有办法让它正常工作呢

我也试过:

publishing {
    repositories {
        clear()
        maven {
            name = 'snapshot'
            url = uri('/tmp/local-repo/snapshots')
        }
        maven {
            name = 'release'
            url = uri('/tmp/local-repo/release')
        }
    }
}
这在以下方面失败:

A problem occurred configuring root project 'test-common-plugin1913987501683151177'.
> Exception thrown while executing model rule: PublishingPluginRules#publishing(ExtensionContainer)
  > Cannot add task 'publishMavenJavaPublicationToSnapshotRepository' as a task with that name already exists.

我感到惊讶的是,删除所有存储库并不会同时删除它们所拥有的所有任务。当我试图以编程方式删除它抱怨的任务时,Gradle声称它不存在。

好吧,我最后不得不(再次)阅读Gradle的源代码,但我找到了一种方法。基本上,您可以直接将
凭证设置回
null
,如下所示:

publishing {
    repositories {
        getByName('snapshot') {
            url = uri('/tmp/local-repo/snapshots')
            configuredCredentials = null
        }
        getByName('release') {
            url = uri('/tmp/local-repo/release')
            configuredCredentials = null
        }
    }
}