Ant构建任务:如何使用Grails2.5更改Ant命令的basedir(例如,如何制作“cd”)

Ant构建任务:如何使用Grails2.5更改Ant命令的basedir(例如,如何制作“cd”),grails,ant,cd,Grails,Ant,Cd,下面的ant代码段来自grails“Scripts”dir中指定的目标,它创建了一个包含所有类校验和的文件,因此可以在目标服务器上检查这些类 ant的输出是如下所示的文件: c9b1c71b31e53e99ff31b4be0a1284558aa019ec target/classes/bo/ApiRequestFilters$_closure1.class ff936fddc1b99ba323493b131d271ca4feb0f5dd target/classes/bo/ApiRequestF

下面的ant代码段来自grails“Scripts”dir中指定的目标,它创建了一个包含所有类校验和的文件,因此可以在目标服务器上检查这些类

ant的输出是如下所示的文件:

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.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文件中删除“target/”:

ant.replace(file:"target/classes.sha1", token:" target/", value: " ")

是否有一个更好的方法?< /P> < p>对于一个小的优化改进,考虑通过嵌套一个<<代码> CONTAAT/<代码>删除<代码>替换<代码>任务。< /P> 在下面的示例中,筛选器使用正则表达式匹配以哈希值开头的行,后跟字符串

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惩罚