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我想匹配<include name="kotlin-compiler-(.*)" ext="zip" matcher="exactOrRegexp"/>
之类的东西
【参考方案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:如何按模式包含常春藤工件?的主要内容,如果未能解决你的问题,请参考以下文章