2016-01-06 20 views
1

以下來自grails「Scripts」dir中指定目標的螞蟻片段,創建一個帶有所有類的校驗和,因此可以在目標服務器上進行檢查。Ant構建任務:如何使用grails更改ant命令的basedir(例如,如何做「cd」)2.5

螞蟻的輸出是這樣的文件:

c9b1c71b31e53e99ff31b4be0a1284558aa019ec target/classes/bo/ApiRequestFilters$_closure1.class 
ff936fddc1b99ba323493b131d271ca4feb0f5dd target/classes/bo/ApiRequestFilters.class 
df7a12fe1182b5fc10177a2559a3a0cbb0709e29 target/classes/com/xxx/yyy/apiConstants.class 

的問題是文件路徑中的字「目標」。當應用程序部署到webapp下的tomcat時,沒有目標。

這怎麼可以避免?例如。如果ant.concat函數使用了一個basedir:「target」,如果您可以執行ant.cd(「target」)或類似的命令,它將解決問題,或者如果您可以指定每個目標的basedir,但這似乎不可能?

來源:

ant.checksum(fileext:".sha1", algorithm: "SHA", forceoverwrite: "yes", pattern: "{0} {3}") { 
    fileset(dir: "target/classes") { 
     include(name:"**/*.class") 
    } 
} 

ant.concat(destfile:"target/classes.sha1") { 
    fileset(dir: "target/classes") { 
     include(name:"**/*.sha1") 
    } 
} 

我發現了一個哈克的方式 - 刪除 「目標/」 從SHA1文件中使用後:

ant.replace(file:"target/classes.sha1", token:" target/", value: " ") 

有沒有更好的辦法?

回答

1

對於小的優化改進,考慮通過嵌套filterchainconcat下刪除replace任務。

在以下示例中,replaceregex過濾器使用正則表達式來匹配以散列值開頭,後跟字符串target/的行。如果行的開頭匹配,則替換爲target/部分刪除:

ant.concat(destfile:"target/classes.sha1") { 
    fileset(dir: "target/classes") { 
     include(name:"**/*.sha1") 
    } 
    filterchain { 
     tokenfilter { 
      // Using the regex "pattern" to match: 
      // 
      // "^": from the start of each line... 
      // "[0-9a-f]+": ...match as many hexadecimal characters as possible... 
      // " ": ...followed by a space character... 
      // "target/": ...followed by the string "target/". 
      // 
      // "([0-9a-f]+)": captures the matching characters in group 1 
      // 
      // Then in "replace": 
      // "\\1": inserts capture group 1 
      // 
      replaceregex(pattern: "^([0-9a-f]+)target/", replace: "\\1") 
     } 
    } 
} 

上面的例子避免了concat的I/O處罰文件寫入到磁盤隨後replace任務重新開放文件並重新寫入。