如果蚂蚁的目标名称包含某些单词,我想设置一些变量。这可能吗?我可以获得当前执行目标的名称吗?
编辑:我尝试使用-d
运行ant,我注意到环境变量TEMP_A
似乎保留了当前目标的名称。我想知道,这会在不同的蚂蚁版本中发挥作用吗?
答案 0 :(得分:3)
您可以使用内置(自JDK 6)Javascript引擎创建一个macrodef,不需要额外的库。
类似的东西:
<project>
<!--
Loglevel defined in org.apache.tools.ant.Project
MSG_ERR = 0;
MSG_WARN = 1;
MSG_INFO = 2;
MSG_VERBOSE = 3;
MSG_DEBUG = 4;
-->
<!-- macrodef creating a property with name of executing target
optional logging to stdout via adjustable loglevel -->
<macrodef name="showtargetname">
<attribute name="property"/>
<attribute name="loglevel" default="3"/>
<sequential>
<script language="javascript">
t = self.getOwningTarget();
self.getProject().setNewProperty("@{property}", t);
self.log("TargetName => " + t, @{loglevel});
</script>
</sequential>
</macrodef>
<target name="foobar">
<showtargetname property="foo"/>
<echo>$${foo} => ${foo}</echo>
</target>
</project>
之后,您将目标名称作为进一步处理的属性,即f.e。使用condition task(=&gt; contains)检查属性是否包含某些字符串
或者,也可以将“targetname包含某些字符串”的逻辑添加到macrodef中。
要探索可供自己使用的内容,请使用:
<script language="javascript">
for(x in self) {self.log(x);}
</script>
答案 1 :(得分:2)
如果您在构建过程中需要该信息,那么您应始终能够确定目标名称,因为大多数情况下您在目标中。因此,可以向目标主体添加一行代码,根据名称设置属性。那将是纯粹的手工方法。
也许您想要某种通用(自定义)任务,比如可以复制到任何目标的一行代码并确定当前目标名称。我不知道提供此名称的内置属性。但是,如果您编写自定义任务和子类org.apache.tools.ant.Task
,那么您可以获取“父”目标的名称并构建属性。
(如果apache在网上发布了API,那么我就能给出更准确的答案......)
修改强>
从外面可以实现。可以实现一个监听器并将其附加到ant。因此,当输入目标时,听众将收到通知。但问题可能是改变“内部”蚂蚁的财产。我实际上并不知道这个监听器是否与ant线程存在于同一个VM中。
答案 2 :(得分:1)
当前执行目标名称没有内置属性。这显然是设计上的;该属性存在于早期版本的Ant中,但已被删除以避免可能的滥用。
查看此问题:Print/Access the Name of the Currently Executing Ant Target
另请参阅Ant创建者在此电子邮件主题中的讨论:link text
答案 3 :(得分:0)
另一种方法是通过JavaScript与Java Reflection。
您可以在ant构建文件中包含以下scriptdef。
然后将<currentTarget/>
放在任何目标中以显示名称。
显然,这是一个简单的例子,但它可以以其他方式使用。
<scriptdef name="currentTarget" language="javascript">
java.lang.System.out.println(project.getThreadTask(java.lang.Thread.currentThread()).getOwningTarget());
</scriptdef>