自 Apache Ant 1.6 起
这使用一个<sequential>
嵌套任务作为模板来定义一个新的任务。嵌套元素<attribute>
和<element>
用于指定新任务的属性和元素。当运行新任务时,这些元素会被替换到<sequential>
任务中。
您也可以使用先前定义的属性为其他属性的默认值。请参阅示例。
属性 | 描述 | 必需 |
---|---|---|
name | 新定义的名称。 | 是 |
uri | 此定义应该所在的 uri。 | 否 |
description | 宏定义的描述(仅用于文档目的)。 | 否 |
backtrace | 这控制了在运行宏时检测到错误时的错误回溯。如果设置为true,则会有错误回溯,如果设置为 false,则不会有错误回溯。自 Ant 1.7 起。 |
否;默认值为true |
这用于指定新任务的属性。属性的值会被替换到模板化的任务中。除非设置了默认值,否则这些属性将是必需的属性。
此属性使用类似于 Ant 属性表示法的符号放置在模板化任务的主体中——@{attribute name}
。(可以记住为“将替换放在这个位置”)。
转义序列@@
用于转义@
。这允许@{x}
放置在文本中而不会将x
替换,方法是使用@@{x}
。这对应于属性的$$
转义序列。
属性的大小写被忽略,因此@{myAttribute}
与@{MyAttribute}
的处理方式相同。
属性 | 描述 | 必需 |
---|---|---|
name | 新属性的名称 | 是 |
default | 属性的默认值。 | 否 |
description | 这包含对属性的描述。自 Ant 1.6.1 起 | 否 |
doubleexpanding | 控制属性引用在属性中是扩展两次还是只扩展一次。有关详细信息,请参阅常见问题解答。自 Ant 1.8.3 起 | 否;默认值为true |
这用于指定新任务的嵌套元素。任务实例的嵌套元素的内容将放置在模板化任务中的标签名称处。
element
名称的大小写被忽略。
属性 | 描述 | 必需 |
---|---|---|
name | 元素的名称。 | 是 |
optional | 如果为true,则此嵌套元素是可选的。 |
否;默认值为false——新任务中需要嵌套元素 |
implicit | 如果为true,则此嵌套元素是隐式的。这意味着 macrodef 实例的任何嵌套元素都将放置在由此元素的名称指示的元素中。如果元素是隐式的,则只能有一个元素。自 Ant 1.6.2 起 |
否;默认值为false |
description | 这包含一个描述,告知用户元素的内容应该是什么。自 Ant 1.6.1 起 | 否 |
这用于指定宏调用的文本内容的处理方式。如果此元素不存在,则宏调用中的任何嵌套文本都将是错误。如果text
元素存在,则名称将成为一个属性,该属性被设置为宏调用的嵌套文本。自 Ant 1.6.1 起。
text
名称的大小写被忽略。
属性 | 描述 | 必需 |
---|---|---|
name | 文本属性的名称。 | 是 |
optional | 如果为true,则宏中的嵌套文本是可选的。 |
否;默认值为false |
trim | 如果为true,则嵌套文本将被修剪掉空白。 |
否;默认值为false |
description | 这包含一个描述,告知用户宏的嵌套文本应该是什么。 | 否 |
以下示例定义了一个名为 testing 的任务并运行它。
<macrodef name="testing"> <attribute name="v" default="NOT SET"/> <element name="some-tasks" optional="yes"/> <sequential> <echo>v is @{v}</echo> <some-tasks/> </sequential> </macrodef> <testing v="This is v"> <some-tasks> <echo>this is a test</echo> </some-tasks> </testing>
以下片段定义了一个名为<call-cc>
的任务,它接受属性target、link和target.dir以及嵌套元素cc-elements
。任务的主体使用来自ant-contrib项目的<cc>
任务。
<macrodef name="call-cc"> <attribute name="target"/> <attribute name="link"/> <attribute name="target.dir"/> <element name="cc-elements"/> <sequential> <mkdir dir="${obj.dir}/@{target}"/> <mkdir dir="@{target.dir}"/> <cc link="@{link}" objdir="${obj.dir}/@{target}" outfile="@{target.dir}/@{target}"> <compiler refid="compiler.options"/> <cc-elements/> </cc> </sequential> </macrodef>
然后可以按如下方式使用它
<call-cc target="unittests" link="executable" target.dir="${build.bin.dir}"> <cc-elements> <includepath location="${gen.dir}"/> <includepath location="test"/> <fileset dir="test/unittest" includes = "**/*.cpp"/> <fileset dir="${gen.dir}" includes = "*.cpp"/> <linker refid="linker-libs"/> </cc-elements> </call-cc>
以下片段显示了<call-cc>
,但这次使用了一个隐式元素,并且link和target.dir参数具有默认值。
<macrodef name="call-cc"> <attribute name="target"/> <attribute name="link" default="executable"/> <attribute name="target.dir" default="${build.bin.dir}"/> <element name="cc-elements" implicit="yes"/> <sequential> <mkdir dir="${obj.dir}/@{target}"/> <mkdir dir="@{target.dir}"/> <cc link="@{link}" objdir="${obj.dir}/@{target}" outfile="@{target.dir}/@{target}"> <compiler refid="compiler.options"/> <cc-elements/> </cc> </sequential> </macrodef>
然后可以按如下方式使用它,请注意没有指定<cc-elements>
。
<call-cc target="unittests"> <includepath location="${gen.dir}"/> <includepath location="test"/> <fileset dir="test/unittest" includes = "**/*.cpp"/> <fileset dir="${gen.dir}" includes = "*.cpp"/> <linker refid="linker-libs"/> </call-cc>
以下显示了text
元素的使用。
<macrodef name="echotest"> <text name="text"/> <sequential> <echo>@{text}</echo> </sequential> </macrodef> <echotest> Hello world </echotest>
以下使用先前定义的属性来设置另一个属性的默认值。输出将是one=test two=test
。如果您更改*1 和 *2 行的顺序,输出将是one=test two=@{one}
,因为在处理two行时,one的值尚未设置。
<macrodef name="test"> <attribute name="one"/> *1 <attribute name="two" default="@{one}"/> *2 <sequential> <echo>one=@{one} two=@{two}</echo> </sequential> </macrodef> <test one="test"/>