我正在尝试解决我们的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文件会大大简化关于神器本身。
因此,我的想法是使用extra
标记上的artifact
属性来“注入”此信息并覆盖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"... />
?
<triggers>
<ant-call target="ivy-post-retrieve-trigger" prefix="dep" event="post-retrieve-artifact"/>
</triggers>
ivysettings.xml
此文件基本上具有触发器和其他解析器设置。
<contains>
问题2:有关“noexpand”名称的任何建议?我对Property "doexpand" has not been set
条款的关注是“扩展”会一直受到打击。
我认为我已接近完成这项工作 - 但我获得的唯一信息是:extra
因此它正在跳过提取步骤。 Q3 有关如何在trigger
上使用Ant / Ivy的launchPlayer(id): void {
this.youtube.player.loadVideoById(id);
this.youtube.videoId = id;
return this.youtube;
}
属性的任何提示/建议/示例?
答案 0 :(得分:0)
我最终向Ivy添加了一些额外的调试语句(从源代码编译)。在ant-ivy/src/java/org/apache/ivy/ant/AntCallTrigger.java
我添加了以下行:
Message.verbose("\tp.name=" + p.getName() + " | p.value=" + p.getValue() );
如果我将 Ivy.xml 文件中的依赖项修改为:
<dependency org="my.org" name="foo" rev="${foo.version}" conf="${conf.archive}->*" transitive="false">
<artifact name="megapin" type="war" e:expand="true"/>
</dependency>
这表明
[ivy:retrieve] p.name=dep.expand | p.value=true
此时我可以做类似
的事情<isset property="dep.expand"/>
或
<istrue value=${dep.expand}/>
这回答了我的 Q1 。另外,我不需要将它添加到常春藤检索模式(因此在检索后更改文件名),可以根据需要使用“true”或“false”值( Q2 ),这个一般指导答案 Q3 。