繁体   English   中英

对Ant中的后续JavaScript使用相同的作用域

[英]Using the same scope for subsequent Javascripts in Ant

Apache Ant允许按此处所述使用脚本。

这是一个最小的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失败,并带有运行时异常,因为testvar未在其范围内定义,这表明每次调用的范围都不相同。

我想做的是避免在每个脚本中都设置与上述function echo(msg)相同的实用程序函数,但是如果没有共享范围,这将是不可能的。

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

<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脚本等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM