我正在尝试创建一个Ant构建,它将在文件夹中的每个子文件夹中运行目标。我特别需要这个只在子文件夹级别运行,因为如果我从顶部文件夹运行它并告诉它包含子文件夹,它会扰乱结果。
我把我所看到的建议放在一起,它看起来很接近,但它不起作用。关于它的几点:
-
当我运行这个时,我得到"C:DeveloperSVNtrunkDITAxxx_conversiontest${subdir}不存在。"(子目录确实存在,我有…testtestsubxxx_xxx.dita)
-
名为"script"的目标本身可以完美地工作。如果我把它指向一个文件夹,它就会转换其中的内容,并给出我需要的结果。
-
在
foreach
任务中,如果我将<dirset dir=".">
更改为测试,则构建成功,但它基本上只是运行"script"
目标。 -
在名为"脚本"的目标中,如果我将
"*.dita"
更改为"***.dita"
,则在其操作中包含顶级文件夹,因此结果不是我需要的,这只是在每个子文件夹中获取每个.dita文件,并将其包装在与dita文件同名的文件夹中:
启动状态:testsubxxx_xxx.dita
期望结果:testsubxxx_xxxxxx_xxx.dita
置乱结果:testsubxxx_xxxtestsubxxx_xxx.dita
如果有人能告诉我这个(可能很多)有什么问题,那就太好了:
<project name="move_and_wrap_dita_topics" default="script" basedir="C:DeveloperSVNtrunkDITAxxx_conversiontest">
<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:DeveloperSVNtrunkDITAxxx_conversioncleaned" verbose="true">
<fileset dir="C:DeveloperSVNtrunkDITAxxx_conversiontest">
<include name="*.dita"/>
</fileset>
<scriptmapper language="javascript">
self.addMappedName(source.replace(source.split('.')[0], source.split('.')[0] + "/" + source.split('.')[0]));
</scriptmapper>
</copy>
</target>
</project>
作为替代方案,如果有某种方法可以在"script"
任务中编写"include name"
,以便它完全跳过顶部文件夹,只从子文件夹开始重写,那将更简单。我试过<include name="/*.dita"/>
和各种各样的其他变化,但没有运气。
启动状态:
testsubxxx_xxx.dita
期望结果:
testsubxxx_xxxxxx_xxx.dita
这应该可以用一个单一的regex映射器,你不需要foreach
:
<copy todir="C:DeveloperSVNtrunkDITAxxx_conversioncleaned" verbose="true">
<fileset dir="C:DeveloperSVNtrunkDITAxxx_conversiontest"
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
文件,regex将源中的testsub/xxx.dita
转换为目标中的testsub/xxx/xxx.dita
。如果你想找到一个或多个深度的文件,那么使用*/**/*.dita
代替。