在Ivy中我可以像这样声明依赖:
<dependency org="org" name="module_name" rev="12" conf="conf_name->*">
<include name="foo(.*)-bar" ext="zip" matcher="exactOrRegexp"/>
</dependency>
将下载所有匹配的文件。
如何在Gradle中定义相似(基于正则表达式)的依赖?
答案 0 :(得分:4)
经过一些试验和错误后,我能够使用以下语法扩展Gradle以解决依赖关系:
dependencies {
compile "org:module_name:12" {
artifact {
name "foo.*-bar"
type "zip"
}
}
}
为此,需要项目评估监听器,它将对依赖关系进行后处理。解析每个依赖项的ivy描述符,解析它,匹配工件名称,更新依赖项的工件描述符(删除名称中带有模式的描述符,并将匹配的工件与名称一起插入)。
优点:
实施过程中发现的陷阱:
在解析常春藤描述符之前复制配置。已解析的配置(带有依赖项)被认为是不可变的,不会再次解析,因此不会下载匹配的工件
匹配不同的实体。在Ivy描述符被解析后#34;并且下载了,将它与未解析的依赖项(更新工件描述符)相匹配有点棘手,因为已解析的实体具有不同的类型。到目前为止,匹配&#34; group-artifact-version&#34;坐标有效,但它是脆弱的解决方案。
可以找到依赖处理器的示例代码on GitHub(免责声明:提供&#34;原样&#34;,没有保证和责任。但如果它打破了您的项目的工作副本,请让我知道)
答案 1 :(得分: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"
}
}
}
Regex用于过滤本地文件或编译不同的项目库:
compile fileTree (dir: "libs", includes: ['*.jar'])
在依赖性声明中不允许使用正则表达式 。
至少,您可以使用变量compile "foo:foo:$libVersion"
,但不能使用正则表达式。
此外,本文Java Build Tools: How Dependency Management Works with Maven, Gradle and Ant + Ivy可能会有所帮助。