代码之家  ›  专栏  ›  技术社区  ›  Geo

如何找到正在执行的ant目标的名称[[副本]

  •  2
  • Geo  · 技术社区  · 14 年前

    编辑:我试过和蚂蚁一起跑步 -d ,我注意到一个环境变量 TEMP_A

    4 回复  |  直到 14 年前
        1
  •  2
  •   Andreas Dolk    14 年前

    如果您在构建过程中需要这些信息,那么您应该始终能够确定目标名称,因为大多数时候您需要 里面

    org.apache.tools.ant.Task 然后您就可以获得“父”目标的名称并构建属性。

    (如果apache在web上发布了API,那么我就能给出更精确的答案……)

    可能是从外面。可以实现一个侦听器并将其附加到ant。因此,当输入目标时,侦听器将收到通知。但问题可能是改变蚂蚁内部的属性。我不知道这个监听器是否和ant线程“生活”在同一个VM中。

        2
  •  3
  •   Rebse    11 年前

    您可以使用内置(自jdk6以来)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>
    

    condition task (=>包含),以检查属性是否包含某些字符串。
    或者将“targetname包含某些字符串”的逻辑也添加到macrodef中。


    <script language="javascript">
     for(x in self) {self.log(x);}
    </script>
    
        3
  •  1
  •   Community CDub    8 年前

    当前正在执行的目标名称没有内置属性。这显然是故意的;该属性在早期版本的Ant中存在,但被删除以避免潜在的滥用。

    看看这个问题: Print/Access the Name of the Currently Executing Ant Target

    link text

        4
  •  0
  •   pixman20    11 年前

    另一种方法是通过JavaScript和Java反射。 您可以在ant构建文件中包含以下scriptdef。 <currentTarget/> 在任何目标中显示名称。 显然,这是一个简单的例子,但它可以用在其他方面。

    <scriptdef name="currentTarget" language="javascript">
      java.lang.System.out.println(project.getThreadTask(java.lang.Thread.currentThread()).getOwningTarget());
    </scriptdef>