2011-01-28 60 views
1

我想寫一個帶有<copy>任務的通用Ant構建腳本,該任務可以根據regexps選擇性地重命名文件。嵌套的<regexpmapper>會從項目特定的屬性文件(如果存在)加載重命名模式。Ant正則表達式映射器:從文件中讀取模式?

有人已經做過這個或我必須寫一個自己的映射器嗎?

回答

1

下面是一個如何做到這一點的例子。

項目屬性文件proj_props.txt包含:

use.filter=regexp.mapper 
from.regexp=(.*)_test(.*) 
to.regexp=\\1\\2 

(注意逃逸的\字符串。)

構建文件:

<property file="proj_props.txt" /> 

<!-- filter for regexp -->  
<filtermapper id="regexp.mapper"> 
    <tokenfilter> 
     <replaceregex pattern="${from.regexp}" 
         replace="${to.regexp}" /> 
    </tokenfilter> 
</filtermapper> 

<!-- identity filter, used when no regexp needed --> 
<filtermapper id="identity.mapper" /> 

<!-- decide which filter to use --> 
<condition property="chosen.mapper" 
      value="regexp.mapper" else="identity.mapper"> 
    <isset property="use.filter" /> 
</condition> 

<copy todir="..."> 
    <fileset> 
     ... 
    </fileset> 
    <filtermapper refid="${chosen.mapper}" /> 
</copy> 

你定義一對filtermapper的情況下,一根據項目屬性文件中的屬性執行regexp替換,另一個不會事情。 use.filter屬性決定選擇哪個。如果項目屬性文件不存在use.filter將不會被設置,那麼將使用'不做'身份過濾器映射器。

請注意,這隻適用於在copy任務中使用嵌套資源。如果您只有一個文件要複製,並使用<copy file="...",則會忽略filtermapper。