我正在尝试找出一种让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