Ant构建仅在子目录上运行

时间:2014-07-12 11:49:11

标签: file-io ant ant-contrib

我正在尝试创建一个Ant构建,它将在文件夹中的每个子文件夹中运行目标。我特别需要这个只能在子文件夹级别运行,因为如果我从顶层文件夹运行它并将其调用以包含子文件夹,它会对结果进行加扰。

我将以下内容与我已经看过的建议放在一起,看起来很接近,但它无法正常工作。关于它的几点意见:

  • 当我运行时,我得到" C:\ Developer \ SVN \ trunk \ DITA \ xxx_conversion \ test \ $ {subdir}不存在。" (一个子目录确实存在,我有... \ test \ testsub \ xxx_xxx.dita)

  • 目标名为"脚本"完美无瑕。如果我将它指向一个文件夹,它会转换其中的内容,并为我提供我需要的结果。

  • foreach任务中,如果我将<dirset dir=".">更改为测试,则构建成功,但它基本上只按原样运行"script"目标。

  • 在名为&#34;脚本&#34;的目标中,如果我将"*.dita"更改为"**\*.dita",则在其操作中包含顶级文件夹,因此结果不是我的需要,这只是将每个.dita文件放在每个子文件夹中并将其包装在与dita文件同名的文件夹中:

开始状态:testsub\xxx_xxx.dita

期望的结果:testsub\xxx_xxx\xxx_xxx.dita

加扰结果:testsub\xxx_xxx\testsub\xxx_xxx.dita

如果有人能告诉我这个(可能是很多事情)有什么不对,那就太棒了:

<project name="move_and_wrap_dita_topics" default="script" basedir="C:\Developer\SVN\trunk\DITA\xxx_conversion\test">

<taskdef resource="net/sf/antcontrib/antlib.xml">
</taskdef>

<foreach target="script" param="worksheet" inheritall="true">
  <path>
      <dirset dir="${subDir}">
           <include name="*"/>
      </dirset>
  </path>
</foreach>

<target name="script">
   <copy todir="C:\Developer\SVN\trunk\DITA\xxx_conversion\cleaned" verbose="true">
     <fileset dir="C:\Developer\SVN\trunk\DITA\xxx_conversion\test">
        <include name="*.dita"/> 
     </fileset>
        <scriptmapper language="javascript">
   self.addMappedName(source.replace(source.split('.')[0], source.split('.')[0] + "/" + source.split('.')[0]));
      </scriptmapper>
  </copy>
</target>

</project>

作为替代方案,如果有某种方法可以在"include name"任务中编写"script",以便它完全跳过顶层文件夹并且只从子文件夹开始重写,那就会更简单。我已经尝试了<include name="/*.dita"/>和其他各种变化,但没有运气。

1 个答案:

答案 0 :(得分:1)

  

开始状态:testsub\xxx_xxx.dita

     

期望的结果:testsub\xxx_xxx\xxx_xxx.dita

这应该适用于单个正则表达式映射器,您根本不需要foreach

<copy todir="C:\Developer\SVN\trunk\DITA\xxx_conversion\cleaned" verbose="true">
  <fileset dir="C:\Developer\SVN\trunk\DITA\xxx_conversion\test"
           includes="*/*.dita" />
  <!-- use handledirsep to treat \ as if it were / in the source file name -->
  <regexpmapper handledirsep="true" from="^(.*)/([^/]*)\.dita$"
                to="\1/\2/\2.dita" />
</copy>

includes="*/*.dita"将匹配文件集基本目录下一级的.dita个文件,正则表达式会将源中的testsub/xxx.dita转换为testsub/xxx/xxx.dita目的地。如果您要查找深度为一级或多级的文件,请改用*/**/*.dita