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)
,但如果没有共享范围,则无法实现。
答案 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脚本等。