1

我正在用 ant 文件集/regexpmapper 将头撞在砖墙上,试图简单地重命名一个目录(在路径中间)......

情况其实很简单:

  • component/DB/我有要复制到的路径DB/api/src/main/distribution/component
  • 路径组件/DB 包含一组 install.sql 脚本和一个名为api(或“API”或“Api”)的目录。这个“api”目录包含额外的 sql,并将被批量复制到目标中DB/api/component(因此创建DB/api/src/main/distribution/component/api)。
  • 作为此副本的一部分,我只想将“api”目录名称小写以保持一致性。

听起来很简单,我一直在使用文件集和regexpmapper(或mapper type=regexp)来实现这一点。${file.separator}但是,我得到了好坏参半的结果......值得注意的是,一旦我将“/”放入(或“\\”或“/”或,即使使用regexpmapper.handledirsep=yes),它也不起作用。

这是混淆的源路径结构(来自find):

component/DB/
component/DB/API
component/DB/API/file1.sql
component/DB/API/file2.sql
component/DB/xyz.sql
component/DB/Install_API.sql
component/DB/excludes1/...

我的基本副本如下:

<copy todir="${my.db.api.dir}/src/main/distribution/component" verbose="true">
    <fileset dir="${component.src.dir}/DB">
        <exclude name="exclude1"/>
        <exclude name="exclude1/**/*"/>
    </fileset>
    <regexpmapper handledirsep="yes"
            from="(.*)/API(.*)" to="\1/api\2"/>
    <!--mapper type="regexp" from="(.*)/API(.*)" to="\1/api\2"/-->
</copy>

为了清楚起见,我留下了简单的“/”。您可以看到基本前提是发现“API”,抓取周围的文本并用“api”重播它。如果我在其中省略了“/”,from那么这确实有效,但是一旦我将“/”(或它的朋友)放入,则根本不会复制目录。请注意,我想要前面的“/”,因为我只想重命名该目录,而不是其中包含的 Install_API.sql 文件。

网上有很多示例,但似乎没有人遇到过这个问题,因为所谓的工作示例似乎都使用普通的“/”、“\”或声称由handledirset属性处理。

RH6.3 上的蚂蚁 1.8.4

非常感谢。

4

1 回答 1

1

您的文件集的基目录是DBdir,这意味着您的映射器将要映射的路径的形式为

API/file1.sql
Install_API.sql
excludes1/...

相对于该目录。API因此目录名称前面没有斜杠,并且您的from模式永远不会匹配。from但是还有一个更深层次的问题,那就是 regexpmapper 完全忽略了任何与模式不匹配的文件名。这不是您想要的,因为您需要更改APIapi但保持非 API 文件名不变。因此,regexpmapper您需要的不是filtermapper带有replaceregex过滤器的 a:

<copy todir="${my.db.api.dir}/src/main/distribution/component" verbose="true">
    <fileset dir="${component.src.dir}/DB">
        <exclude name="exclude1"/>
        <exclude name="exclude1/**/*"/>
    </fileset>
    <filtermapper>
        <!-- look for either just "API" with no trailer, or API followed by
             a slash, in any combination of case -->
        <replaceregex pattern="^API(?=${file.separator}|$$)" replace="api"
                      flags="i"/><!-- case-insensitive search, finds API, Api, ... -->
    </filtermapper>
</copy>
于 2014-09-26T15:35:59.657 回答