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

Gradle: How do I include ivy artifacts by pattern?

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

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

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

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

您可以查看 GradleDependency Management -> Defining custom patterns for an Ivy repository

相关的文档
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

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

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

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

优点:

  • 正确使用 Gradle 的工件缓存。
  • 避免传输 exra(不匹配)工件。
  • 已应用依赖项解析机制。

实施过程中发现的陷阱:

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

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

可以找到依赖处理器的示例代码on GitHub(免责声明:提供"as is",没有任何保证和责任。但是如果它破坏了你的项目的工作副本,请告诉我)