【发布时间】:2017-11-15 05:43:49
【问题描述】:
我正在尝试解决我们的 Ant/Ivy 系统中的一些技术债务,我当前的任务之一是解决我们目前拥有的一些检索后行为。默认情况下,我们的构建系统会检索 Ivy 依赖项,然后将压缩的工件(仅 tar、tar.bz2、gzip、zip)提取到依赖项文件夹,以便我们的项目具有一致的依赖项位置:
(project.root)/dependency/.archive <- the compressed dependency location
(project.root)/dependency/extracted-foo` <- the uncompressed dependency
提取发生在post-retrieve-artifact trigger 中,因此我们可以从一些元数据(路径、名称、类型等,都以“dep”为前缀。
我们目前有一个属性可以设置为关闭 ivy.xml 文件中指定的所有依赖项的默认行为。因此,我们处于一个全有或全无的境地。如果我们想要介于两者之间的东西,我们目前必须使用我们的 build.xml 文件并编写一些自定义代码。这很痛苦,因为元数据不容易获得。
我想保留 all-or-nothing 标志的使用,但允许项目有选择地提取项目 - 我们有几个项目的 build.xml 文件将大大简化,如果我们可以将提取过程分解为一个属性关于工件本身。
因此,我的想法是在artifact 标签上使用extra 属性来“注入”此信息并覆盖ivy.retrieve.pattern 以搜索此属性。
Ivy.xml
<ivy-module version="2.0" xmlns:e="http://ant.apache.org/ivy/extra">
<dependencies>
<dependency org="my.org" name="foo" rev="${foo.version}" conf="${conf.archive}->*" transitive="false">
<artifact name="megapin" type="war" e:expand="expand"/>
</dependency>
</dependencies>
</ivy-module>
Build.xml
这就是我认为无法显示 expand 额外属性的地方。
问题 1: 这确实在检索时将“提取”属性添加到工件名称。我可以使用contains 子句来检查dep.to 中是否存在这种情况是否有办法检索extra 属性(例如${dep.extra.expand}?
<property name="ivy.retrieve.pattern" value="${dependency.dir}/[conf]/[artifact]-[rev])(-[expand]).[ext]"/>
</property>
<target name="ivy-post-retrieve-trigger">
<local name="doexpand"/>
<condition property="doexpand">
<contains string="${dep.to}" substring="expand" casesensitive="false"/>
</condition>
<!-- this step works if the flag is set properly, so I'm leaving out these non-relevant steps-->
<...extract if:isset="doexpand"... />
ivysettings.xml
这个文件基本上有触发器和其他解析器设置。
<triggers>
<ant-call target="ivy-post-retrieve-trigger" prefix="dep" event="post-retrieve-artifact"/>
</triggers>
问题 2:关于“noexpand”名称有什么建议吗?我对<contains> 子句的担忧是“扩展”会一直受到打击。
我想我已经接近完成这项工作了 - 但我得到的唯一信息是:Property "doexpand" has not been set,因此它正在跳过提取步骤。 Q3 关于如何将 trigger 上的 extra 属性与 Ant/Ivy 一起使用的任何提示/建议/示例?
【问题讨论】: