2010-07-02 58 views
2

說我想設置一些變量,如果一個螞蟻的目標名稱包含某些單詞。這可能嗎?我可以獲得當前執行的目標名稱嗎?如何找到正在執行的螞蟻目標的名稱?

編輯:我試着用-d運行螞蟻,我注意到一個環境變量TEMP_A似乎持有當前目標的名稱。我想知道,這是否會跨越不同的螞蟻版本?

+0

你在buildscript或螞蟻的代碼是什麼意思? – Redlab 2010-07-02 11:32:03

+0

直接在螞蟻中。 – Geo 2010-07-02 11:34:04

回答

2

如果您在構建過程中需要這些信息,那麼您應該始終能夠確定目標名稱,因爲大部分時間您都在之內,目標是。因此,可以將一行代碼添加到目標主體,該目標主體根據名稱設置屬性。那將是純粹的手動方法。

也許你想要某種常規(自定義)任務,比如可以複製到任何目標並確定當前目標名稱的一行代碼。我不知道在提供這個名稱的財產構建。但是,如果您編寫自定義任務和子類org.apache.tools.ant.Task,那麼您可能可以獲取「父」目標的名稱並構建該屬性。

(如果Apache已經在網站上公佈的API,那麼我能夠給出更精確的答案...)

編輯

,便有可能來自外部。可以實現一個監聽器並將其附加到螞蟻。所以當進入目標時,聽衆會得到通知。但問題可能是更改螞蟻內部的財產。我實際上不知道這個監聽者是否與螞蟻線程在同一個虛擬機中「生活」。

+0

我需要在執行某個任務之前執行此操作。 – Geo 2010-07-02 12:07:04

0

另一種方法是通過JavaScript和Java反射。 您可以在您的ant構建文件中包含以下腳本定義。 然後只需將<currentTarget/>放置在任何目標中即可顯示名稱。顯然,這是一個簡單的例子,但它可以以其他方式使用。

<scriptdef name="currentTarget" language="javascript"> 
    java.lang.System.out.println(project.getThreadTask(java.lang.Thread.currentThread()).getOwningTarget()); 
</scriptdef> 
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.的TARGETNAME使用condition task(=> contains)來檢查屬性是否包含某些字符串。
或者將「targetname包含特定字符串」的邏輯也添加到macrodef。

探討什麼是可自我,使用方法:

<script language="javascript"> 
for(x in self) {self.log(x);} 
</script>