为什么Gradle不使用在插件的pom.xml中声明的Maven存储库?

时间:2019-03-19 17:07:30

标签: gradle pom.xml gradle-plugin

考虑一下,我制作了一个自定义的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

1 个答案:

答案 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这种对您自己的插件的特殊依赖

  •   
  • 激励该库的所有者将其发布到知名的存储库或插件的存储库中

  •   
  • 配置插件的存储库以也镜像其他存储库

  •