2011-11-23 57 views
1

在ANT構建文件上工作,其中我定義了兩個宏並需要從其他宏調用一個宏。javascript + ANT問題

這是我需要做的事情(爲了便於理解,我簡化了整個場景)。我的主要目標是用兩個參數調用FirstMacro。第一個宏需要收到兩個參數,然後對SecondMacro進行嵌入式調用。

傳遞給FirstMacro的參數之一是一個帶有「反斜槓」()的文件路徑。當我使用echo在宏中打印時,它的打印效果很好。但是當我通過JavaScript將相同的參數傳遞給SecondMacro時,反斜槓消失了(而不是C:\ Test我看到C:Test)。 什麼是保留反斜槓或用正斜槓替換它們的解決方案。

請注意,我使用ANT 1.7和我已經嘗試與string.replace(/ \ /克,「/」)等

還要注意的是,你可以複製粘貼下面的整個代碼,將其保存作爲build.xml並嘗試運行主任務以查看運行中的問題。

<?xml version="1.0"?> 
<project name="build" basedir="." default="main"> 
    <description> 
    ========================== 
    Macro: Second Macro 
    ========================== 
    </description> 
    <macrodef name="secondMacro"> 
     <attribute name="param"/> 

     <sequential> 
      <echo>secondMacro param: @{param}</echo> 
     </sequential> 
    </macrodef> 

    <description> 
    ========================== 
    Macro: FirstMacro 
    ========================== 
    </description> 
    <macrodef name="firstMacro"> 
     <attribute name="param1"/> 
     <attribute name="param2"/> 

     <sequential> 
      <echo>firstMacro first param: @{param1}</echo> 
      <echo>firstMacro second param: @{param2}</echo> 
      <script language="javascript"> 
       <![CDATA[ 
        var ext = "@{param2}"; 
        if ("".equals(ext)) { 
         ext = "out"; 
        } 

        macrotask = project.createTask("secondMacro"); 
        macrotask.setDynamicAttribute("param", "@{param1}" + "."+ext); 
        macrotask.perform(); 
       ]]> 
      </script> 
     </sequential> 
    </macrodef> 

    <description> 
    ========================== 
    Target: main target 
    ========================== 
    </description> 
    <target name="main"> 

     <firstMacro param1="C:\TestFolder/TestFile" param2=""/> 
    </target> 
</project> 

回答

0
<firstMacro param1="C:\\TestFolder/TestFile" param2=""/> 

打印

主:

[回波] firstMacro第一個參數:C:\ TestFolder/TESTFILE
[回波] firstMacro第二PARAM:
[ echo] secondMacro param:C:\ TestFolder/TestFile.out

它應該是你的JS代碼的問題。我對JS知之甚少,但在大多數語言中,反斜槓意味着「這是一個轉義字符」。所以當JS看到一個反斜槓時,它可能將其視爲轉義字符並做一些轉換...... 即使使用beanshell或其他東西,也可能發生類似的事情。

爲了解決這個問題,你可以嘗試修改您的JS代碼(我實在忍不住了,不好意思)或嘗試使用斜槓(/)而不是反斜線

更新:您可以使用來自ant-contrib的if任務。
以下是if-task版本「firstMacro」的示例。

<macrodef name="firstMacro"> 
    <attribute name="param1"/> 
    <attribute name="param2"/> 
    <sequential> 
     <echo>firstMacro first param: @{param1}</echo> 
     <echo>firstMacro second param: @{param2}</echo> 
     <if> 
      <equals arg1="@{param2}" arg2="" /> 
      <then> 
       <property name="param" value="@{param1}.out" /> 
      </then> 
      <else> 
       <property name="param" value="@{param1}[email protected]{param2}" /> 
      </else> 
     </if> 
     <secondMacro param="${param}" /> 
    </sequential> 
</macrodef> 
+0

謝謝。但問題是Param1不在我的控制之下,它可能有一個「反斜槓」。如果我可以避免使用Javascript,一些如何可以通過使用條件任務等,這個問題可能被繞過。 – niner

+0

更新了我的答案。你可以使用Ant-contrib任務嗎?它提供了if結構。 – coolcfan

+1

謝謝!是的,我研究了這一點,似乎解決了這個問題。我發現的另一種替代方法是使用ANT 1.8,並使用屬性與一起使用。 – niner