gradle - 为什么 Gradle 不使用插件 pom.xml 中声明的 Maven 存储库?
问题描述
考虑我已经制作了一个自定义 Gradle 插件,该插件可在以下位置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")
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")
到buildscript
使用我的插件的每个项目的部分,我不想强迫我的用户这样做。
有没有替代解决方案?
更新:这已作为问题 #8811报告给Gradle团队。
解决方案
引用Gradle团队的回应:
Gradle 的行为实际上有充分的理由:
Gradle 非常重视依赖的来源。对于 Gradle,
org:foo:1.0
来自 Maven Central 和org:foo:1.0
来自 JCenter 被认为是不同的东西。这就是存储库排序和过滤很重要的原因。存储库劫持已被证明是一种攻击媒介,因此拥有一个有效、可传递和透明地允许从任何存储库下载依赖项的系统是不安全的。
由于这些原因,这是一个不太可能发生的变化。
但是,您的插件有一些选项:
将这种奇异的依赖隐藏到您自己的插件中
激励该库的所有者将其发布到众所周知的存储库或插件的存储库中
配置插件的存储库以镜像其他存储库
推荐阅读
- python - 在 Python 中公开序列化函数
- parallel-processing - 将 gnu 的输出并行传输到单个文件或管道是否安全
- flume - 边缘节点上的 Apache Flume 设置说明
- c - Printf 不立即打印,虽然缓冲被禁用
- raku - Perl 6 Cro 的存根不运行:请求 HTTP/2,但不支持 ALPN
- verilog - 如何根据状态图对 3 位二进制计数器模块进行编码?
- c# - DateTime.Parse 抛出 FormatException 而不管 CultureInfo
- python - Django,为什么我的 jquery url 视图重复?
- c - 尝试打开文件时出现读取访问冲突错误
- arrays - 我们如何在codeigniter中比较两个具有相同索引的数组值