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它。