我正试图想办法让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.
答案 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