我可以使Ant复制任务特定于操作系统吗?

时间:2020-03-05 18:59:43  来源:igfitidea点击:

我有一个Ant脚本,可使用"复制"任务执行复制操作。它是为Windows编写的,具有硬编码的C:\路径作为'todir'参数。我看到'exec'任务有一个OS参数,是否有类似的方法可以基于OS分支副本?

解决方案

回答

我们不能使用变量并根据类型进行分配吗?我们可以将其放在" build.properties"文件中。或者,我们可以使用条件进行分配。

回答

我们可以使用条件任务分支到不同的复制任务...,请参阅ant手册:

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

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

  </not>
</and>

回答

声明一个变量,该变量是操作的根文件夹。使用该变量为文件夹添加前缀,包括在复制任务中。

使用条件,根据操作系统设置变量,或者将其作为参数传递给Ant脚本。

回答

我建议将路径放在属性中,然后根据当前操作系统有条件地设置属性。

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

附带的好处是,一旦将其放置在属性中,就可以覆盖它而无需编辑Ant脚本。

回答

先前发布的有关特定于OS的变量的建议将起作用,但是很多时候我们可以简单地省略" C:"前缀并使用正斜杠(Unix样式)文件路径,并且它在Windows和Unix系统上均可使用。

因此,如果要将文件复制到Windows上的" C:/ tmp"和Unix上的" / tmp",则可以使用以下方法:

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

如果我们确实希望/需要基于OS设置条件路径,则可以将其简化为:

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

回答

Ant-contrib具有<osfamily />任务。这会将os系列暴露给一个属性(我们指定其名称)。这可能会有一些好处。