簡體   English   中英

獲取條件不支持嵌套的“then”元素<condition></condition>

[英]Getting condition doesn't support the nested "then" element in <condition>

我是 Ant/Apache 的新手。 當我嘗試在 XML 中使用<condition>標簽時,它拋出了一個錯誤。 條件不支持嵌套的“then”元素。 這是我的代碼

<target name="determine-ae-build">
    <condition property="ApplicationName">
        <equals arg1="${ApplicationName}" arg2="new"/>
        <then>
            <echo>3.9 Robots Config Copied</echo>
        </then>
        <else>
            <condition property="ApplicationName">
                <equals arg1="${ApplicationName}" arg2="old"/>
                <then>
                    <echo>3.8 Robots Config Copied</echo>
                </then>
                <else>
                    <echo>3.9 Robots Config Copied</echo>
                </else>
            </condition>
        </else>
    </condition>
</target>

我也嘗試過IF但因為我的 Ant 版本不支持這樣做。 有人可以幫助解決這個問題。 謝謝! 提前

<target name="prepare-copy" description="copy file based on condition" depends="determine-ae-build, prepare-copy-old, prepare-copy-new, prepare-copy-default">
    <sleep seconds="10"/> --To read the results
</target>

<target name="prepare-copy-old" description="copy file based on condition" if="copy.old">
    <echo>Old File Copied </echo>
</target>

<target name="prepare-copy-new" description="copy file based on condition" if="copy.new">
    <echo>New File Copied</echo>
</target>

<target name="prepare-copy-default" description="copy file based on false condition" if="copy.default">
    <echo>Default File Coping</echo>
</target>

<target name="determine-ae-build">      
    <condition property="copy.old">
        <equals arg1="${ApplicationName}" arg2="old"/>
    </condition>
    
    <condition property="copy.new">
        <equals arg1="${ApplicationName}" arg2="new"/>
    </condition>
    
    <condition property="copy.default">
        <not>
            <or>
                <equals arg1="${ApplicationName}" arg2="new"/>
                <equals arg1="${ApplicationName}" arg2="old"/>
            </or>
        </not>
    </condition>
</target>

解釋:調用方式“ant -Dcopy.old = true prepare-copy”。 在這里,我們正在傳遞以復制舊文件,因此將復制“舊文件已復制”。 如果你稱它為“ant prepare-copy”,它會調用“Default File Coping”。

如果回答了您的問題,請采納我的回答。謝謝!

condition任務只是設置一個屬性; 它不包含嵌套構建邏輯。 它設置的屬性稍后可用於控制執行哪些目標。

雖然您可以使用 antcontrib 的額外ifthenelse任務來完成您在示例中展示的內容,但我建議堅持使用本機 Ant 方法,該方法依賴於目標依賴項並使用單獨的目標來控制構建邏輯:

<project name="build" basedir="." default="build">
    <target name="build" depends="copy-3.8,copy-3.9" />

    <target name="copy-3.8" depends="determine-ae-build" if="copy.old">
        <echo>3.8 Robots Config Copied</echo>
    </target>

    <target name="copy-3.9" depends="determine-ae-build">
        <echo>3.9 Robots Config Copied</echo>
    </target>

    <target name="determine-ae-build">
        <condition property="copy.old">
            <equals arg1="${ApplicationName}" arg2="old"/>
        </condition>
    </target>
</project>

使用上面的腳本,您將運行ant build (可能使用-DApplicationName=old )。 build目標取決於兩個copy目標,這兩個目標都取決於determine-ae-build 因此determine-ae-build目標將首先運行。 如果ApplicationName設置為“old”(來自已加載的屬性文件,或在命令行中使用-DApplicationName=old提供),則屬性copy.old將設置為 true。 否則它將保持未設置狀態。

然后將調用copy-3.8copy-3.9 如果copy.oldtruecopy-3.8將運行。 否則,它將被跳過。 copy-3.9沒有條件,所以無論如何它都會運行。

最后, build目標將執行,因為它是從命令行調用的原始目標,但它不包含任何實際步驟,因此構建將完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM