Ant 构建任务:如何使用 grails 2.5 更改 ant 命令的 basedir(例如,如何执行 "cd")
Ant build task: how to change the basedir for an ant command (e.g. how to do a "cd") with grails 2.5
来自 grails "Scripts" 目录中指定目标的以下 ant 片段创建了一个包含所有 类 校验和的文件,因此可以在目标服务器上检查它们。
蚂蚁的输出是这样一个文件:
c9b1c71b31e53e99ff31b4be0a1284558aa019ec target/classes/bo/ApiRequestFilters$_closure1.class
ff936fddc1b99ba323493b131d271ca4feb0f5dd target/classes/bo/ApiRequestFilters.class
df7a12fe1182b5fc10177a2559a3a0cbb0709e29 target/classes/com/xxx/yyy/apiConstants.class
问题出在文件路径中的单词 "target"。当app部署到webapp下tomcat时,没有target。
如何避免这种情况?例如。如果 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")
}
}
我发现了一种 hacky 方法 - 在使用后从 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")
}
}
}
上面的例子避免了 I/O 惩罚 concat
将文件写入磁盘后跟 replace
任务 re-opening 文件和 re-writing它。
来自 grails "Scripts" 目录中指定目标的以下 ant 片段创建了一个包含所有 类 校验和的文件,因此可以在目标服务器上检查它们。
蚂蚁的输出是这样一个文件:
c9b1c71b31e53e99ff31b4be0a1284558aa019ec target/classes/bo/ApiRequestFilters$_closure1.class
ff936fddc1b99ba323493b131d271ca4feb0f5dd target/classes/bo/ApiRequestFilters.class
df7a12fe1182b5fc10177a2559a3a0cbb0709e29 target/classes/com/xxx/yyy/apiConstants.class
问题出在文件路径中的单词 "target"。当app部署到webapp下tomcat时,没有target。
如何避免这种情况?例如。如果 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")
}
}
我发现了一种 hacky 方法 - 在使用后从 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")
}
}
}
上面的例子避免了 I/O 惩罚 concat
将文件写入磁盘后跟 replace
任务 re-opening 文件和 re-writing它。