考虑一下,我制作了一个自定义的Gradle插件,该插件可在Functor
处获得,并按以下方式应用:
https://repo.example.com/xyz
现在考虑,我需要我的插件依赖于第三方库(// build.gradle.kts
buildscript {
repositories {
jcenter()
maven("https://repo.example.com/xyz")
}
dependencies {
classpath("com.example:xyz-gradle-plugin:1.2.3")
}
}
apply(plugin = "com.example.xyz")
),该库仅可从另一个自定义 Maven 存储库(例如org.something:abc:4.5.6
)中获得。 。我将相应地生成插件的https://repo.something.org/abc
:
pom.xml
现在,当我重建并重新发布该插件时,使用该插件的客户端代码无法构建,因为找不到该插件所依赖的 <dependencies>
<dependency>
<groupId>org.something</groupId>
<artifactId>abc</artifactId>
<version>4.5.6</version>
<scope>compile</scope>
</dependency>
</dependencies>
<repositories>
<repository>
<id>xyz</id>
<url>https://repo.example.com/xyz/</url>
</repository>
<repository>
<id>abc</id>
<url>https://repo.something.org/abc/</url>
</repository>
</repositories>
库。显然,插件的org.something:abc:4.5.6
会被误解:pom.xml
部分将被忽略,而依赖项信息将从中提取。
唯一的解决方法是将<repositories/>
显式添加到使用我的插件的每个项目的maven("https://repo.something.org/abc")
部分中,而我不想强迫用户这样做。
还有其他解决方案吗?
更新:此事件已报告给 Gradle 团队,名称为issue #8811。
答案 0 :(得分:0)
引用 Gradle 小组的回复:
Gradle的行为实际上有充分的理由:
Gradle非常重视依赖项的 source 。对于Gradle,Maven Central的
org:foo:1.0
和JCenter的org:foo:1.0
被认为是不同的东西。这就是为什么存储库排序和filtering很重要的原因。存储库劫持demonstrated as an attack vector一直存在,因此拥有一个有效,可传递和透明地允许从任何存储库下载依赖项的系统都是不安全的。
由于这些原因,这是不太可能发生的变化。
但是您的插件有以下选项:
Shadow这种对您自己的插件的特殊依赖
激励该库的所有者将其发布到知名的存储库或插件的存储库中
配置插件的存储库以也镜像其他存储库