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

时间:2015-06-11 17:48:23

标签: gradle dependencies ivy

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

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

将下载所有匹配的文件。

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

2 个答案:

答案 0 :(得分:4)

经过一些试验和错误后,我能够使用以下语法扩展Gradle以解决依赖关系:

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

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

优点:

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

实施过程中发现的陷阱:

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

  • 匹配不同的实体。在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可能会有所帮助。