在Ant中,如何指定文件名中带逗号的文件?
这是我尝试过的一个示例目标。结果发现,它想要删除所有内容,因为逗号把"**/*"和"cover"分开了——这很容易理解。
<target name="clean">
<delete
verbose="true">
<fileset dir="." includes="**/*.pyo"></fileset>
<fileset dir="." includes="**/*,cover"></fileset>
</delete>
</target>
我该如何指定一个嵌入的逗号呢?
我正在学习Ant,这样我就不需要为不同的操作系统维护不同的构建系统。在这种情况下,它是在一个Python环境中,*,cover文件是由一个叫做Coverage的代码覆盖检查工具创建的。
2 个回答
如果你没有其他以“cover”结尾的文件需要保留,那就把逗号去掉就行了:
<fileset dir="." includes="**/*cover"></fileset>
如果你有其他以“cover”结尾的文件不想删除,可以试试MattDMo评论里的反斜杠建议。你可能需要用双反斜杠来表示("**/*\\,cover
")。
还有一种可能性:你能不能设置Coverage把输出放到另一个文件夹里,这样你就可以直接删除整个文件夹?或者能不能设置成用不同的输出文件名,这样就不会出现这个问题?我对Coverage不太熟悉,不过根据你提供的链接,data_file选项可能可以做到其中一项或两项。
你不需要对这个进行转义。只需用 <include/>
来替代 includes
参数。试试这个:
<project name="test" default="clean">
<dirname property="build.dir" file="${ant.file.test}" />
<target name="clean">
<delete>
<fileset dir="${build.dir}/test">
<include name="**/*,*.xml" />
</fileset>
</delete>
</target>
</project>
顺便说一下,你在 dir
参数中不应该使用 .
(点)。如果你想删除包含 build.xml
文件的目录中的文件,你应该传递绝对路径(你可以像我示例中那样使用 <dirname/>
)。如果你使用 .
,那么在嵌套构建时会遇到问题。想象一下,你有两个构建,它们都在删除文件,但第一个构建还会调用第二个构建:
maindir/build1.xml
<delete dir="." includes="**/*.txt" />
<!-- call clean target from build2.xml -->
<ant file="./subdir/build2.xml" target="clean"/>
maindir/subdir/build2.xml
<delete dir="." includes="**/*.txt" />
在这种情况下,build2.xml 不会删除 subdir 中的 *.txt 文件,而是会删除 maindir 中的 *.txt 文件,因为 ant 属性会传递给 build2.xml。当然,你可以使用 inheritAll="false"
来避免这个问题,但根据我的经验,我知道在路径中使用 .
会给你带来很多麻烦。