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 中定义相似的(基于正则表达式的)依赖关系?
您可以查看 Gradle
与 Dependency 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",没有任何保证和责任。但是如果它破坏了你的项目的工作副本,请告诉我)
在 Ivy 中,我可以像这样声明依赖项:
<dependency org="org" name="module_name" rev="12" conf="conf_name->*">
<include name="foo(.*)-bar" ext="zip" matcher="exactOrRegexp"/>
</dependency>
这将下载所有匹配的文件。
如何在 Gradle 中定义相似的(基于正则表达式的)依赖关系?
您可以查看 Gradle
与 Dependency 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",没有任何保证和责任。但是如果它破坏了你的项目的工作副本,请告诉我)