下面的ant片段来自grails"Scripts"dir中指定的目标,它创建了一个包含所有类的校验和的文件,因此可以在目标服务器上检查它们。
蚂蚁的输出是这样一个文件:
c9b1c71b31e53e99ff31b4be0a1284558aa019ec target/classes/bo/ApiRequestFilters$_closure1.class
ff936fddc1b99ba323493b131d271ca4feb0f5dd target/classes/bo/ApiRequestFilters.class
df7a12fe1182b5fc10177a2559a3a0cbb0709e29 target/classes/com/xxx/yyy/apiConstants.class
问题是文件路径中的单词"target"。当应用程序部署到webapp下的tomcat时,没有目标。
如何避免这种情况?例如,如果ant.coat函数采用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文件中删除"target/":
ant.replace(file:"target/classes.sha1", token:" target/", value: " ")
有更好的方法吗?
对于较小的优化改进,可以考虑通过在concat
下嵌套filterchain
来删除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
将文件写入磁盘,然后由replace
任务重新打开文件并重新写入的I/O惩罚。