2017-06-13 87 views
0

我想解决我们的Ant/Ivy系统中的一些技术债务,我目前的任务之一是解决我们目前有的一些检索后行为。默认情况下,我们的编译系统检索常春藤依赖关系,然后提取压缩后的工件(焦油,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文件并编写一些自定义代码T他是痛苦的,因为元数据不容易获得。

我想保留使用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:这会在检索时将“extract”属性添加到工件名称。我可以使用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:任何sugges tions在“noexpand”的名字?我对<contains>条款的关注是“扩展”会一直受到打击。

我想我已经接近完成这项工作 - 但我得到的唯一信息是:Property "doexpand" has not been set,因此它正在跳过提取步骤。 Q3有关如何在带Ant/Ivy的trigger上使用extra属性的任何提示/建议/示例?

回答

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