2014-03-07 30 views
5

我想弄明白一种方法让Ant运行一个.jar可执行文件,它接受一个文件并从单个输入文件中分出几个生成的文件。具体来说,我试图生成编译的.js文件,同时生成.map文件。为Ant应用指定多个输出文件或目标文件任务

通常情况下,命令会是这样的:

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

其中:

  • compiler-latest是封闭编译罐子
  • a.js是JavaScript文件编译
  • a.min.js是编译的JavaScript
  • a.js.map是源地图

我的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. 

回答

6

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

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

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

谢谢,这几乎解决了我的问题。我确实需要做一些调整,因为我的编译器离我的实际项目目录很远,这些目录为我提供了一些有趣的相关内容。不过,我现在需要弄清楚如何将地图名称附加到缩小脚本的文本末尾,我不确定如果没有某些扩展,Ant就无法做到这一点。我试图用一个'echo'和'concat'任务来运行,所以我想我可以坚持使用批处理/ shell'Makefile'解决方案。非常感谢您的帮助。蚂蚁仍然看起来很强大。 – zero298