2

我正在编写一个用于编译 flex 项目的 ant 文件(但这个问题也可能适用于非 flex ant 脚本)。

我在那里有几个目标,如下所示:

<target name="first">
    <mxmlc file="${src.dir}/FirstClass.as" output="${output.dir}/First.swf" ...identical_compiler_attributes...>
         ...identical_compiler_inner_elements...
         <compiler.define name="AN_ATTRIBUTE" value="A_VALUE" />
    </mxmlc>
</target>

<target name="second">
    <mxmlc file="${src.dir}/SecondClass.as" output="${output.dir}/Second.swf" ...identical_compiler_attributes...>
         ...identical_compiler_inner_elements...

         <!-- no additional compiler.define calls needed -->
    </mxmlc>
</target>

我想通过使用<antcall>ant 任务来避免常见的 mxmlc 属性和内部元素的重复,所以我想出了这样的东西:

<target name="first">
     <antcall target="helper_target">
         <param name="src.file" value="FirstClass.as"/>
         <param name="output.file" value="First.swf"/>
     </antcall>
</target>

<target name="second">
     <antcall target="helper_target">
         <param name="src.file" value="SecondClass.as"/>
         <param name="output.file" value="Second.swf"/>
     </antcall>
</target>

<target name="helper_target">
    <mxmlc file="${src.dir}/${src.file}" output="${output.dir}/${output.file}" ...identical_compiler_attributes...>
         ...identical_compiler_inner_elements...

         <!-- WHAT DO I DO ABOUT THE compiler.define?? -->
    </mxmlc>
</target>

这很好地解决了大多数重复问题。<compiler.define>但是对于 mxmlc 调用之间不同的其他内部元素,我该怎么办?ant的内置if机制在这里对我没有帮助 - 我无法在 mxmlc 元素中间调用目标....

有任何想法吗?(我知道 ant-contrib 有某种 if 机制。宁愿有一个纯蚂蚁解决方案,甚至不确定 ant-contrib 的 if 是否会在这里有所帮助)。

4

1 回答 1

2

这听起来像是 Antpresetdef任务的候选者。该手册对任务进行了如下描述:

预设定义基于具有一些属性或元素预设的当前定义生成新定义。

我不能提供一个例子,mxmlc因为我这里没有 Flex。但这里有一个使用exec任务的例子:

<presetdef name="exec.preset">
    <exec executable="sh" dir=".">
        <arg value="-c" />
        <arg value="echo" />
    </exec>
</presetdef>

<exec.preset>
    <arg value="hello world" />
</exec.preset>

如果你运行它,ant -verbose你会看到

exec.preset] Executing 'sh' with arguments:
[exec.preset] '-c'
[exec.preset] 'echo'
[exec.preset] 'hello world'
[exec.preset] 

在预设调用中提供的额外参数被添加到 exec.preset - 这正是您想要的。

于 2011-09-28T07:08:52.170 回答