Gradle:如何通过模式包含常春藤工件?

Nik*_*sov 10 dependencies ivy gradle

在Ivy中我可以像这样声明依赖:

<dependency org="org" name="module_name" rev="12" conf="conf_name->*">
  <include name="foo(.*)-bar" ext="zip" matcher="exactOrRegexp"/>
</dependency>
Run Code Online (Sandbox Code Playgroud)

这将下载所有匹配的文件.

如何在Gradle中定义类似(基于正则表达式)的依赖?

Nik*_*sov 4

经过更多的尝试和错误后,我能够使用以下语法扩展 Gradle 来解决依赖关系:

dependencies {
    compile "org:module_name:12" {
        artifact {
            name "foo.*-bar"
            type "zip"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

为此,需要项目评估侦听器,它将对依赖项进行后处理。解析每个依赖项的 ivy 描述符,解析它,匹配工件名称,更新依赖项的工件描述符(删除名称中带有模式的描述符并插入名称匹配的工件)。

优点:

  • 正确使用 Gradle 的工件缓存。
  • 避免传输额外(不匹配)的工件。
  • 应用依赖关系解析机制。

实施过程中发现的坑:

  • 在解析 ivy 描述符之前复制配置。已解析的配置(带有依赖项)被认为是不可变的,不会再次解析,因此不会下载匹配的工件

  • 匹配不同的实体。在“解析”并下载 Ivy 描述符后,将其与未解析的依赖项进行匹配(以更新工件描述符)有些棘手,因为解析的实体具有不同的类型。到目前为止,匹配“group-artifact-version”坐标是有效的,但它是脆弱的解决方案。

依赖处理器的示例代码可以在 GitHub 上找到(免责声明:“按原样”提供,没有保证和责任。但如果它破坏了您项目的工作副本,请告诉我)