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

Posted

技术标签:

【中文标题】Gradle:如何按模式包含常春藤工件?【英文标题】:Gradle: How do I include ivy artifacts by pattern? 【发布时间】:2015-08-27 13:37:57 【问题描述】:

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

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

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

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

【问题讨论】:

它处理本地文件还是远程文件? Ivy 存储库是远程的。我宁愿避免通过 Gradle 下载额外的文件并在本地过滤它们 能否提供一个此类库的示例? 例如,Kotlin 语言编译器的构建有其名称中带有构建号的工件。见this ivy descriptor我想匹配&lt;include name="kotlin-compiler-(.*)" ext="zip" matcher="exactOrRegexp"/&gt;之类的东西 【参考方案1】:

经过多次反复试验,我能够使用以下语法扩展 Gradle 以解决依赖关系:

dependencies 
    compile "org:module_name:12" 
        artifact 
            name "foo.*-bar"
            type "zip"
        
    

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

优点:

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

实施过程中发现的陷阱:

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

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

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

【讨论】:

【参考方案2】:

您可以查看与Dependency Management -> Defining custom patterns for an Ivy repository相关的Gradle文档

repositories 
    ivy 
        url "http://repo.mycompany.com/repo"
        layout "pattern", 
            artifact "3rd-party-artifacts/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"
            artifact "company-artifacts/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"
            ivy "ivy-files/[organisation]/[module]/[revision]/ivy.xml"
        
    

正则表达式用于过滤本地文件或编译不同的项目库:

compile fileTree (dir: "libs", includes: ['*.jar'])

Regex 不允许在依赖声明中。

至少,您可以使用变量compile "foo:foo:$libVersion",但不能使用正则表达式。

另外,这篇文章Java Build Tools: How Dependency Management Works with Maven, Gradle and Ant + Ivy 可能会有所帮助。

【讨论】:

我确实了解如何使用 Ivy 存储库,并且我熟悉过滤本地工件时的包含。然而,Ivy 有一个过滤远程依赖的概念,这就是我想在 Gradle 中实现的。

以上是关于Gradle:如何按模式包含常春藤工件?的主要内容,如果未能解决你的问题,请参考以下文章

Gradle:如何发布自定义文件工件?

发布工件覆盖 Gradle 中的其他工件

使用 gradle publish 时,ivy module.xml 不包含所有工件

使用 Gradle 的“仅工件表示法”和自定义工件名称

如何设置 gradle 项目的 maven 工件 ID?

如何使用 gradle API 检查工件是不是存在?