[英]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.