【问题标题】:Renaming files during ANT copy在 ANT 复制期间重命名文件
【发布时间】:2010-11-17 15:50:58
【问题描述】:

我想复制一个文件目录,并在此过程中重命名其中的一些文件。 当我运行下面的脚本时,没有任何副本。 如果我在下面的文件中注释 glob 映射器,则会复制文件(不重命名)

感谢您的帮助。 詹姆斯

<?xml version="1.0" ?>
<project name="Create project structure" default="main">
  <target name="main" description="Copy template files to project folder">
    <echo>Copying template files to project folder</echo>
    <copy todir="${project.dir}" verbose="true" overwrite="true">
      <fileset dir="${shared.files}/templateproject" excludes=".svn"/>
      <mapper>
        <chainedmapper>
          <mapper type="glob" from="*PACKAGENAME*" to="*${package.name}*"/>
          <mapper type="glob" from="*GAMENAME*" to="*${game.name}*"/>
          <mapper type="identity"/>
        </chainedmapper>
      </mapper>
    </copy>
  </target>
</project>

【问题讨论】:

    标签: ant build-process build-automation file-manipulation


    【解决方案1】:

    使用“移动”和正确的映射器类型(如 Mnementh 所示)采用解决方法。谢谢

    <?xml version="1.0" ?>
    <project name="Create project structure" default="main">
        <target name="main" description="Copy template files to project folder">
        <echo>Copying template files to project folder</echo>
        <copy todir="${project.dir}" verbose="true" overwrite="true">
            <fileset dir="${shared.files}/templateproject" excludes=".svn" />
        </copy>
        <move todir="${project.dir}">
            <fileset dir="${project.dir}" />
            <mapper>
            <mapper type="regexp"
                    from="(.*)PACKAGENAME(.*)" to="\1${package.name}\2" />
            <mapper type="regexp"
                    from="(.*)GAMENAME(.*)" to="\1${game.name}\2" />
            </mapper>
        </move>
        </target>
    </project>
    

    【讨论】:

    • 很好的解决方案!似乎不起作用的一件事是,如果您有多个要替换的项目。例如。考虑路径:PACKAGENAME\blah\foo\PACKAGENAME。我观察到只有第一次重命名有效。我粗略的解决方法是简单地使用 循环来执行此移动 10 次。丑陋但它似乎工作。
    【解决方案2】:

    看来,glob-mapper 仅适用于一个“*”。我会试试regexp-mapper:

    <mapper type="regexp" from="(.*)PACKAGENAME(.*)" to="\1${package.name}\2"/>
    <mapper type="regexp" from="(.*)GAMENAME(.*)" to="\1${game.name}\2"/>
    

    【讨论】:

    • 感谢您的回答。这是要使用的正确类型的映射器。但是,映射器一次只想工作一个 - 如果我注释掉其中两个,另一个将工作。我需要对它们中的每一个进行测试 - 尝试第一次替换,然后是第二次替换,如果仍然不复制(身份映射器)。无论如何,谢谢 - 这很有帮助。
    【解决方案3】:

    您的问题是您没有选择正确的映射器:&lt;chainedmapper&gt; 将链式传递信息从第一个映射器到最后一个映射器

    应该使用&lt;firstmatchmapper&gt;,它会依次尝试所有映射器,直到匹配到一个为止

    参考:http://ant.apache.org/manual/Types/mapper.html

    (相当老的问题,但我刚刚发现搜索几乎相同的问题:-))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-22
      • 2012-12-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多