Gradle 格雷德尔:我如何按模式包括常春藤人工制品?

Gradle 格雷德尔:我如何按模式包括常春藤人工制品?,gradle,dependencies,ivy,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中定义类似的(基于正则表达式的)依赖关系?您可以查看与 正则表达式用于过

在Ivy中,我可以这样声明依赖关系:

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

将下载所有匹配的文件


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

您可以查看与

正则表达式用于过滤本地文件或编译不同的项目库:

compile fileTree (dir: "libs", includes: ['*.jar'])
依赖项声明中不允许使用正则表达式

至少,您可以使用变量
编译“foo:foo:$libVersion”
,但不能使用正则表达式


另外,这篇文章可能会有所帮助。

经过更多的尝试和错误,我能够扩展Gradle,以使用以下语法解决依赖关系:

dependencies {
    compile "org:module_name:12" {
        artifact {
            name "foo.*-bar"
            type "zip"
        }
    }
}
为此,需要一个项目评估监听器,该监听器将对依赖项进行后期处理。解析每个依赖项的常春藤描述符,对其进行解析,匹配工件名称,更新依赖项的工件描述符(删除名称中带有模式的工件,插入带有名称的匹配工件)

优点:

  • 正确使用Gradle的工件缓存
  • 避免传输exra(不匹配)工件
  • 应用依赖解析机制
实施过程中发现的陷阱:

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

  • 匹配不同的实体。在一个常春藤描述符被“解析”并下载之后,将其与未解析的依赖项相匹配(更新工件描述符)有些困难,因为解析的实体具有不同的类型。到目前为止,在“组工件版本”坐标上进行匹配是可行的,但这是一个脆弱的解决方案


可以找到dependency processor的示例代码(disclamer:按原样提供,没有保证和责任。但是如果它破坏了项目的工作副本,请让我知道)

它处理本地文件还是远程文件?Ivy存储库是远程的。我希望避免Gradle下载额外的文件并在本地对其进行过滤。请提供这样一个库的示例好吗?例如,Kotlin语言编译器的版本在其名称中有版本号的工件。请参阅我想匹配类似
的内容我确实了解如何使用常春藤存储库,并且在过滤本地工件时我熟悉include。然而,Ivy有一个过滤远程依赖的概念,这就是我想在Gradle实现的。
dependencies {
    compile "org:module_name:12" {
        artifact {
            name "foo.*-bar"
            type "zip"
        }
    }
}