尝试多次调用ANT目标时失败



我使用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>将值分配给标识符,它就不能更改。

虽然,您在两个目标中分别将值设置为outputJStemplatesPath,可能假设/期望本地作用域,但在ant中并非如此。

  • 原因: 一般来说,属性是全局作用域,即一旦它们被定义,它们就可以用于随后调用的任何任务或目标
  • 异常: 不可能在通过ant, antcall或subant任务创建的子构建进程中设置属性并使其可用于调用构建进程
因此,在目标precompile-templates0中定义的outputJStemplatesPath的值在整个构建过程中都是保留的

要解决您的问题,您可以执行以下操作之一:

  • 更改属性名称,例如在目标precompile-templates1
  • 中更改为outputJS1templatesPath1
  • (如果您正在使用Ant 1.8.0或以上)使用<local>任务而不是<property>任务来声明outputJStemplatesPath。参见这里
  • 使用ant-contrib<var>任务。看到 ant contrib var任务

相关内容

  • 没有找到相关文章

最新更新