2017-06-13 86 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