为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是源地图

我的蚂蚁脚本看起来像这样:

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

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

您可以使用ANT <compositemapper>来构造应用程序的命令行。

以下是一个例证。您需要在任务上设置relative="yes",以使相对于构建目录的文件名相对于绝对文件名使用,否则映射更难。要构建命令行提供<compositemapper>中的映射器列表。使用<mergemapper>进行固定零件(例如--output_file等ARG),并在需要生成文件名时使用合适的其他映射器,也许是Glob。需要一系列映射器来将<apply>传递给Java传递给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

最新更新