Using the same scope for subsequent Javascripts in Ant -
apache ant allows use of scripting described here.
here minimal build.xml illustrates problem:
<?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>
the echo("testvar=" + testvar);
in second script fails runtime exception because testvar
not defined in scope, indicating scope different each invocation.
what trying avoid having set same utility functions above function echo(msg)
in every script, without shared scope won't possible.
for reusing functionality use macrodef, use ant task(s) inside <sequential>...</sequential>
. sharing values between isolated parts, use ant api , project scope of ant script ,
create / overwrite property / userproperty.
<project> <macrodef name="foobar"> <attribute name="foo"/> <attribute name="prop"/> <attribute name="val"/> <sequential> <script language="javascript"> // no project.createtask("echo") needed use println('@{foo}'); // create property, property same name overwritten // if it's userproperty, means defined via ant -f build.xml -dkey=value // create or overwrite 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 property project scope println(project.getproperty('someprop')); </script> <!-- use macrodef 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>
output :
[script] yada,yada.. [echo] ${someprop} => somevalue [script] somevalue [script] blablabla..
-- edit after comment --
there's no other way share values etc. .. in ant know of.
when reading refined requirements in comment, believe switching to
gradle way go. it's possible incorporate existing ant scripts etc.
Comments
Post a Comment