简体   繁体   中英

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

I'm new to Ant/Apache. When I tried to use <condition> tag in XML it's throwing an error. condition doesn't support the nested "then" element. Here is my code

<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>

I've tried with IF also but since my Ant version is not supporting to do this. Can someone help to resolve this issue. Thanks! in advance

<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>

Explanation: Calling way "ant -Dcopy.old = true prepare-copy". Here we are passing to copy old file hence, "Old File Copied" will copied. If you call it like "ant prepare-copy" it'll call "Default File Coping".

Kindly Accept my answer if it is answered your question.Thankyou!

The condition task simply sets a property; it doesn't contain nested build logic. The property that it sets can later be used to control which targets are executed.

While you can use antcontrib's extra if , then , and else tasks to accomplish something like what you showed in your example, I'd recommend sticking to the native Ant approach, which relies on target dependencies and uses separate targets to control build logic:

<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>

With the above script, you would run ant build (possibly with -DApplicationName=old ). The build target depends on both copy targets, both of which depend on determine-ae-build . The determine-ae-build target will therefore run first. If ApplicationName is set to "old" (either from a properties file that has been loaded, or from being provided in command line with -DApplicationName=old ) then the property copy.old will be set to true. Otherwise it will remain unset.

Then copy-3.8 and copy-3.9 will be called. If copy.old is is true , copy-3.8 will run. Otherwise, it will be skipped. copy-3.9 has no condition so it will run no matter what.

Lastly, the build target will execute because it was the original target called from the command line, but it contains no actual steps so the build will finish.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM