2016-01-06 21 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任务重新开放文件并重新写入。