为Ant应用任务指定多个输出文件或目标文件

时间:2014-03-07 00:18:40

标签: ant

我正试图想办法让Ant运行一个接受文件的.jar可执行文件,并从单个输入文件中吐出几个生成的文件。具体来说,我正在尝试生成已编译的.js文件,同时生成.map文件。

通常,命令看起来像这样:

java -jar compiler-latest --js a.js --js_output_file a.min.js --create_source_map a.js.map

其中:

  • compiler-latest是闭包编译器jar
  • a.js是要编译的JavaScript文件
  • a.min.js是已编译的JavaScript
  • a.js.map是源地图

My Ant脚本如下所示:

<project name="BuildTest" default="Build" basedir=".">
   <description>
      HTML Build Test with Ant
   </description>
   <property name="src" location="../js"/>
   <property name="dst" location="../build"/>
   <property name="compiler" location="../compiler.jar"/>

   <!--Make Dest Directory-->
   <target name="-destination">
      <mkdir dir="${dst}"/>
   </target>

   <!--Compile JS-->
   <target name="Build" depends="-destination">

      <!--Filesets and Mappers-->
      <fileset id="sourceFiles" dir="${src}" includes="*.js"/>
      <mapper id="compiledJs" type="glob" from="*.js" to="*.compiled.js"/>
      <mapper id="mapJs" type="glob" from="*.js" to="*.js.map"/>

      <!--Apply Everything-->
      <apply executable="java" parallel="false" dest="${dst}">

         <!--Closure Compiler-->
         <arg value="-jar"/>
         <arg path="${compiler}"/>
         <arg value="--compilation_level=SIMPLE_OPTIMIZATIONS"/>

         <!--Source Files-->
         <arg value="--js"/>
         <srcfile/>
         <fileset refid="sourceFiles"/>

         <!--Output Files-->
         <arg value="--js_output_file"/>
         <targetfile/>
         <mapper refid="compiledJs"/>

         <!--Source Maps-->
         <arg value="--source_map_format=V3"/>
         <arg value="--create_source_map"/>
         <arg value="--js_output_file"/>
         <targetfile/>
         <mapper refid="mapJs"/>
      </apply>
   </target>

   <!--Clean Project-->
   <target name="Clean" description="Cleans the project">
      <delete dir="${dst}"/>
   </target>
</project>

但是,我收到错误消息,说我不能有多个<targetfile/>元素

apply doesn't support multiple targetfile elements.

1 个答案:

答案 0 :(得分:7)

这是一种解决方法,不是很好,但有效。

您可以使用Ant <compositemapper>为您的应用程序构建命令行。

以下是插图。您需要在任务上设置relative="yes",以便相对于构建目录使用的文件名优先于绝对文件名,否则映射会更难。要构建命令行,请在<compositemapper>内提供映射器列表。使用<mergemapper>作为固定部分(如--output_file这样的参数),并在需要生成文件名时使用合适的其他映射器(可能是glob)。 需要一系列映射器来将<apply>传递给java的参数分开,否则它们将作为一个带有嵌入空格的长arg传递。

<apply executable="java" parallel="false" relative="yes">
  <arg line="-jar compiler-latest --js"/>
  <srcfile />
  <targetfile />

  <compositemapper>
    <mergemapper             to="--js_output_file" />
    <globmapper  from="*.js" to="*.compiled.js" />
    <mergemapper             to="--source_map_format=V3" />
    <mergemapper             to="--create_source_map" />
    <globmapper  from="*"    to="*.map" />
  </compositemapper>

  <fileset dir="." includes="*.js" />
</apply>

对于导致命令行的简单测试,如:

java -jar compiler-latest --js 1.js --js_output_file 1.compiled.js --source_map_format=V3 --create_source_map 1.js.map