我试图想办法让Ant运行一个接受文件的.jar可执行文件,并从单个输入文件中吐出几个生成的文件.具体来说,我正在尝试生成已编译的.js文件,同时生成.map文件.
通常,命令看起来像这样:
java -jar compiler-latest --js a.js --js_output_file a.min.js --create_source_map a.js.map
Run Code Online (Sandbox Code Playgroud)
哪里:
compiler-latest 是封闭编译器jara.js 是要编译的JavaScript文件a.min.js 是编译的JavaScripta.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>
Run Code Online (Sandbox Code Playgroud)
但是,我得到一个错误,说我不能有多个<targetfile/>元素
apply doesn't support multiple targetfile elements.
Run Code Online (Sandbox Code Playgroud)
这是一种解决方法,不是很好,但有效.
您可以使用Ant <compositemapper>为应用程序构造命令行.
下面是一个例子.您需要设置relative="yes"任务,以便相对于构建目录使用的文件名优先于绝对文件名,否则映射会更难.要构建命令行,请在其中提供一个映射器列表<compositemapper>.当你需要生成文件名时,使用一个<mergemapper>固定的部分(如args --output_file),并使用合适的其他映射器,可能是一个glob.需要一系列映射器来分隔传递给java的参数<apply>,否则它们将作为一个带有嵌入空格的长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>
Run Code Online (Sandbox Code Playgroud)
对于导致命令行的简单测试,例如:
java -jar compiler-latest --js 1.js --js_output_file 1.compiled.js --source_map_format=V3 --create_source_map 1.js.map
Run Code Online (Sandbox Code Playgroud)