Ant 构建任务:如何使用 grails 2.5 更改 ant 命令的 basedir(例如如何执行"cd")



下面的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惩罚。

相关内容

  • 没有找到相关文章

最新更新