在Ant中使用相同的范围用于后续Javascripts

时间:2015-07-08 04:09:50

标签: javascript ant rhino

Apache Ant允许使用here所述的脚本。

这是一个说明问题的最小 build.xml

<?xml version="1.0"?>
<project name="test" default="test" basedir=".">
    <target name="test">
        <script language="javascript"><![CDATA[
            function echo(msg) {
                var echo = project.createTask("echo");
                echo.setMessage(msg);
                echo.perform();
            }
            testvar = "ok";
            echo("testvar=" + testvar);
        ]]></script>

        <script language="javascript"><![CDATA[
            function echo(msg) {
                var echo = project.createTask("echo");
                echo.setMessage(msg);
                echo.perform();
            }
            echo("testvar=" + testvar);
        ]]></script>
    </target>
</project>

第二个脚本中的echo("testvar=" + testvar);因运行时异常而失败,因为testvar未在其范围内定义,表明每个调用的范围都不同。

我要做的是避免在每个脚本中设置相同的实用程序函数,如上面的function echo(msg),但如果没有共享范围,则无法实现。

1 个答案:

答案 0 :(得分:1)

要重用功能,请使用macrodef,使用<sequential>...</sequential>中的任何ant任务。 要在孤立的部分之间共享值,请使用ant api和ant脚本的项目范围,并创建/覆盖属性/ userproperty。

<project>
 <macrodef name="foobar">
  <attribute name="foo"/>
  <attribute name="prop"/>
  <attribute name="val"/>
   <sequential>
    <script language="javascript">
     // no project.createTask("echo") needed just use
     println('@{foo}');
     // create property, property with same name will be overwritten
     // if it's a userproperty, means defined via ant -f build.xml -Dkey=value
     // create or overwrite it with project.setUserProperty(key, value);
     project.setProperty('@{prop}', '@{val}');
    </script>
   </sequential>
 </macrodef>

 <foobar foo="yada,yada.." prop="someprop" val="somevalue"/>

 <echo>$${someprop} => ${someprop}</echo>

 <script language="javascript">
  //access some property from project scope
  println(project.getProperty('someprop'));
 </script>

 <!-- use macrodef from script task -->
 <script language="javascript">
  var macro = project.createTask("foobar");
  macro.setDynamicAttribute("foo", "blablabla..");
  macro.setDynamicAttribute("prop", "someprop");
  macro.setDynamicAttribute("val", "somevalue");
  // or macro.perform();
  macro.execute();
 </script>
</project>

输出:

[script] yada,yada..           
[echo] ${someprop} => somevalue
[script] somevalue             
[script] blablabla.. 
评论后

- 编辑 -
在我知道的蚂蚁中没有别的方法可以分享价值等等 在评论中阅读您的精确要求时,我相信转换为Gradle是可行的方法。可以合并现有的ant脚本等。