首页 文章

Ant-Ivy post-retrieve-trigger

提问于
浏览
0

我正在尝试解决我们的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属性来"inject"此信息并覆盖 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 额外属性的地方 .

Question 1: 这会在检索时将"extract"属性添加到工件名称 . 我可以使用 contains 子句检查_1603649中是否存在_是否有办法检索 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>

Question 2: 有关"noexpand"名称的任何建议吗?我对 <contains> 条款的关注是"expand"会一直受到打击 .

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

1 回答

  • 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 . 另外,我不需要将它添加到常 Spring 藤检索模式(因此在检索后更改文件名),可以根据需要使用"true"或"false"值( Q2 ),并且此一般指导回答 Q3 .

相关问题