2013-08-21 64 views
1

我有一個場景,我需要將目錄從一個位置移動到另一個位置。如果目標文件夾中存在相同的目錄,我需要將目錄名稱重命名爲oldname_1。 所以我寫了一個片段如下:如果其他條件在螞蟻任務產生錯誤

<target name="Move"> 
    <IF> 
     <available file="${output.dir}" type="dir" /> 
     <then> 
      <echo message="Directory exists" /> 
      <rename src="${output.dir}" dest="${output.dir}_1"/> 
      <property name="newdirectory" value="${dest}"/> 
     </then> 
    <ELSE> 
     <echo message="Directory does not exist" /> 
    </ELSE> 
    </IF> 
     <move file="${newdirectory}" todir="C:\reports" /> 
    </target> 

我得到的錯誤是:

 
Problem: failed to create task 
Cause: The name is undefined. 
Action: Check the spelling. 
Action: Check that any custom tasks/types have been declared. 
Action: Check that any/declarations have taken place. 
+0

你們又添加了必要的對於[ant-contrib](http://ant-contrib.sourceforge.net/),''?請記住,Ant沒有內置的本地if/else構造。 –

+0

是的,我也嘗試過。有另一個錯誤說:[[taskdef]無法從資源net/sf/antcontrib/antcontrib.properties加載定義,無法找到它。「 – user2677829

回答

0

的,如果/ else結構是不螞蟻的本地部分開箱即用,它提供通過ant-contrib項目,您需要下載JAR並將相關的<taskdef>添加到您的構建文件中。例如,如果你下載ant-contrib-1.0b3.jar,並把它放在一個在同一目錄下的build.xml命名build目錄,那麼你可以說

<taskdef resource="net/sf/antcontrib/antcontrib.properties"> 
    <classpath> 
    <pathelement location="build/ant-contrib-1.0b3.jar"/> 
    </classpath> 
</taskdef> 
2

正如Ian Roberts已經提到的,你需要的螞蟻的Contrib罐子,然後設置<taskdef/>指向這個罐子。我強烈建議將其放入您的項目中,並將其檢入您的版本控制系統。這樣,當有人簽出您的項目時,他們已經安裝了Ant-Contib.jar

我的標準是把爲構建所需的所有可選的罐子(編制要求不罐子)目錄${basedir}/antlib,然後把每個可選罐子在自己的目錄,所以我會把ant-contrib-1.0b3.jar${basedir}/antlib/antcontrib

然後我定義任務是這樣的:

<property name="antlib.dir"  value="${basedir}/antlib"/> 

<taskdef resource="net/sf/antcontrib/antlib.xml"> 
    <classpath> 
     <fileset dir="${antlib.dir}/antcontrib"/> 
    </classpath> 
</taskdef> 

這樣一來,如果你更新的jar文件到Ant的罐子的Contrib的新版本,你只需將其插入目錄。您不必更新build.xml

另請注意,我使用net/sf/antcontrib/antlib.xml而不是net/sf/antcontrib/antcontrib.propertiesXML文件是你應該使用。這方面的指示在tasks page上,與安裝指導下的main page不同。原因是XML文件具有<for>任務的正確定義,屬性文件不具有。


然而,還有另一種方式來做到ifunless在螞蟻1.9.1無需可選的jar文件。這些是新的If and Unless entity attributes

這些可以放在所有任務,或子實體,並且通常可以代替螞蟻的Contrib if/else東西:

<target name="move"> 
    <available file="${output.dir}" type="dir" 
     property="output.dir.exists"/> 
    <echo message"Directory exists" 
     if:true="output.dir.exists"/> 
    <move file="${output.dir}" tofile="${output.dir}_1" 
     if:true="output.dir.exists"/> 
    <property name="newdirectory" value="${dest}" 
     if:true="output.dir.exists"/> 
    <echo message="Directory does not exists" 
     unless:true="output.dir.exists"/> 
    <move file="${newdirectory}" todir="C:\reports" /> 
</target> 

不那麼幹淨如你的榜樣。不過,我會改用目標名稱if=unless=參數:

<target name="move.test"> 
    <available file="${output.dir}" type="dir" 
     property="output.dir.exists"/> 
</target> 

<target name="move" 
    depends="move.test, move.exists, move.does.not exists"> 
    <move file="${newdirectory}" todir="C:\reports" /> 
</target> 

<target name="move.exists" 
    if="output.dir.exists"> 
    <echo message="Directory exists" /> 
    <move file="${output.dir}" tofile="${output.dir}_1"/> 
    <property name="newdirectory" value="${dest}"/> 
</move.exists/> 

<target name="move.does.not.exists" 
    unless="output.dir.exists"/> 
    <echo message="Directory does not exist" /> 
</target> 

如果沒有回聲的一切,結構會有點清潔:

<target name="move.test"> 
    <available file="${output.dir}" type="dir" 
     property="output.dir.exists"/> 
</target> 

<target name="move" 
    depends="move.test, backup"> 
    <move file="${newdirectory}" todir="C:\reports" /> 
</target> 

<target name="backup" 
    if="output.dir.exists"> 
    <move file="${output.dir}" tofile="${output.dir}_1"/> 
    <property name="newdirectory" value="${dest}"/> 
</move.exists/>