Question

I have an Ant script that performs a copy operation using the 'copy' task. It was written for Windows, and has a hardcoded C:\ path as the 'todir' argument. I see the 'exec' task has an OS argument, is there a similar way to branch a copy based on OS?

Was it helpful?

Solution

I would recommend putting the path in a property, then setting the property conditionally based on the current OS.

<condition property="foo.path" value="C:\Foo\Dir">
   <os family="windows"/>
</condition>
<condition property="foo.path" value="/home/foo/dir">
   <os family="unix"/>
</condition>

<fail unless="foo.path">No foo.path set for this OS!</fail>

As a side benefit, once it is in a property you can override it without editing the Ant script.

OTHER TIPS

The previously posted suggestions of an OS specific variable will work, but many times you can simply omit the "C:" prefix and use forward slashes (Unix style) file paths and it will work on both Windows and Unix systems.

So, if you want to copy files to "C:/tmp" on Windows and "/tmp" on Unix, you could use something like:

<copy todir="/tmp" overwrite="true" >
         <fileset dir="${lib.dir}">
             <include name="*.jar" />
         </fileset>
</copy>

If you do want/need to set a conditional path based on OS, it can be simplified as:

    <condition property="root.drive" value="C:/" else="/">
        <os family="windows" />
    </condition>
    <copy todir="${root.drive}tmp" overwrite="true" >
             <fileset dir="${lib.dir}">
                 <include name="*.jar" />
             </fileset>
    </copy>

You could use the condition task to branch to different copy tasks... from the ant manual:

<condition property="isMacOsButNotMacOsX">
<and>
  <os family="mac"/>

  <not>
    <os family="unix"/>

  </not>
</and>

Declare a variable that is the root folder of your operation. Prefix your folders with that variable, including in the copy task.

Set the variable based on the OS using a conditional, or pass it as an argument to the Ant script.

You can't use a variable and assign it depending on the type? You could put it in a build.properties file. Or you could assign it using a condition.

Ant-contrib has the <osfamily /> task. This will expose the family of the os to a property (that you specify the name of). This could be of some benefit.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top