【问题标题】:Gradle: How do I include ivy artifacts by pattern?Gradle:如何按模式包含常春藤工件?
【发布时间】: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;之类的东西

标签: gradle dependencies ivy


【解决方案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 中实现的。
    猜你喜欢
    • 2012-12-23
    • 2016-02-15
    • 2011-04-12
    • 2013-12-19
    • 2015-12-04
    • 2014-10-20
    • 1970-01-01
    • 2017-08-06
    • 2017-08-13
    相关资源
    最近更新 更多