【问题标题】:Ant regexpmapper file separator issuesAnt regex mapper 文件分隔符问题
【发布时间】:2014-09-26 15:02:32
【问题描述】:

我正在用 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 上的 ant 1.8.4

非常感谢。

【问题讨论】:

    标签: regex ant fileset


    【解决方案1】:

    您的文件集的基本目录是 DB 目录,这意味着您的映射器将要映射的路径采用以下形式

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

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

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

    【讨论】:

    • 非常感谢,这是我错过的一堂课。如果可以,我有一个后续问题......在我的输出中,我现在看到/src/main/distribution/component\api(我想要)但也看到/src/main/distribution/component/API(详细日志告诉我“[复制] API 添加为 API 没有” t 存在。”和“将 1 个空目录复制到 ...component 下的 1 个空目录”。之后我可以删除它,但想知道这是否是配置问题(在 mo 阅读)。非常感谢您的帮助.
    • @wmorrison365 这很奇怪,我认为 fileset 应该是一组 文件,不包括 API 目录作为其条目之一(我在不区分大小写的 FS 上进行了测试,所以一开始没有发现)。我稍微改变了我的正则表达式,所以它只匹配“API”以及“API/something”。
    • 再次感谢@ianroberts。鉴于您的解释,我认为不包括文件 sep 而只使用 ^。不过我会试试你的改进。非常感谢!
    • This answer 也与映射器的工作方式非常相关 - 与 ant 映射器文档一起使用。
    猜你喜欢
    • 2013-12-11
    • 2012-04-14
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    相关资源
    最近更新 更多