我使用ANT在构建时预编译把手栏。我遵循这里的方式http://blog.selvakn.in/2012/05/precompiling-handlerbars-tempates-with.html。而且只针对一个目标,效果很好。然后我尝试像这样调用目标两次:
<?xml version="1.0" encoding="UTF-8" standalone="no"?><project basedir="." default="echoIt" name="precompile">
<property name="charset" value="utf-8"/>
<target name="echoIt">
</target>
<target name="precompile-templates0" depends="echoIt">
<property name="outputJS" value="../../jsp/jsp_1/js/templates0.js"/>
<property name="templatesPath" value="../../jsp/jsp_1/js/tmpl"/>
<java dir="${basedir}" failonerror="true" fork="true" jar="../../lib/js.jar">
<arg value="../../otherFiles/lib/rhino-handlebars-compiler.js"/>
<arg value="--handlebars"/>
<arg value="../../otherFiles/third-party/handlebars-v1.3.0.js"/>
<arg value="--templates"/>
<arg value="${templatesPath}"/>
<arg value="--output"/>
<arg value="${outputJS}"/>
</java>
<echo>Template Precompiled to web/js/compiled-templates.js</echo>
<echo> is now ready to compress....</echo>
</target>
<target name="precompile-templates1" depends="echoIt">
<property name="outputJS" value="../../jsp/jsp_2/js/templates1.js"/>
<property name="templatesPath" value="../../jsp/jsp_2/js/tmpl"/>
<echo> is now precompiling the second one </echo>
<java dir="${basedir}" failonerror="true" fork="true" jar="../../lib/js.jar">
<arg value="../../otherFiles/lib/rhino-handlebars-compiler.js"/>
<arg value="--handlebars"/>
<arg value="../../otherFiles/third-party/handlebars-v1.3.0.js"/>
<arg value="--templates"/>
<arg value="${templatesPath}"/>
<arg value="--output"/>
<arg value="${outputJS}"/>
</java>
<echo>Template Precompiled to web/js/compiled-templates.js</echo>
<echo> is now ready to compress....</echo>
</target></project>
控制台上的输出如下所示:
Buildfile: F:AffirmedNetworksServerAutomationcachesubBuildTargetprecompileTarget.xml
echoIt:
precompile-templates0:
[echo] Template Precompiled to web/js/compiled-templates.js
[echo] is now ready to compress....
echoIt:
precompile-templates1:
[echo] is now precompiling the second one
[echo] Template Precompiled to web/js/compiled-templates.js
[echo] is now ready to compress....
BUILD SUCCESSFUL
Total time: 2 seconds
可以看到,构建是成功的。然而,当我检查预期目录中的输出时,在路径中只生成了' templates0.js ':jsp/jsp_1/js/。路径:jsp/jsp_2/js/中没有任何内容。但是,在这个文件夹中应该有一个名为'templates1.js'的文件。这真的很奇怪。没有出现任何错误,并且成功生成了第一个on,但是第二个消失了。有人能帮我一下吗?谢谢!
问题在于您对<property>
任务的重用!
Properties
是不可变的:谁先设置一个属性冻结它的其余构建;它们绝对不是变量。即,一旦您使用<property>
将值分配给标识符,它就不能更改。
虽然,您在两个目标中分别将值设置为outputJS
和templatesPath
,可能假设/期望本地作用域,但在ant
中并非如此。
- 原因: 一般来说,属性是全局作用域,即一旦它们被定义,它们就可以用于随后调用的任何任务或目标
- 异常: 不可能在通过ant, antcall或subant任务创建的子构建进程中设置属性并使其可用于调用构建进程
precompile-templates0
中定义的outputJS
和templatesPath
的值在整个构建过程中都是保留的。要解决您的问题,您可以执行以下操作之一:
- 更改属性名称,例如在目标
precompile-templates1
中更改为outputJS1和templatesPath1 - (如果您正在使用
Ant 1.8.0
或以上)使用<local>
任务而不是<property>
任务来声明outputJS
和templatesPath
。参见这里 - 使用
ant-contrib
的<var>
任务。看到 ant contrib 和 var任务。