在Ant中,如何指定文件名中带逗号的文件?

1 投票
2 回答
1650 浏览
提问于 2025-04-17 19:08

这是我尝试过的一个示例目标。结果发现,它想要删除所有内容,因为逗号把"**/*"和"cover"分开了——这很容易理解。

<target name="clean">
    <delete
        verbose="true">
        <fileset dir="." includes="**/*.pyo"></fileset>
        <fileset dir="." includes="**/*,cover"></fileset>
    </delete>
</target>

我该如何指定一个嵌入的逗号呢?

我正在学习Ant,这样我就不需要为不同的操作系统维护不同的构建系统。在这种情况下,它是在一个Python环境中,*,cover文件是由一个叫做Coverage的代码覆盖检查工具创建的。

2 个回答

0

如果你没有其他以“cover”结尾的文件需要保留,那就把逗号去掉就行了:

<fileset dir="." includes="**/*cover"></fileset>

如果你有其他以“cover”结尾的文件不想删除,可以试试MattDMo评论里的反斜杠建议。你可能需要用双反斜杠来表示("**/*\\,cover")。

还有一种可能性:你能不能设置Coverage把输出放到另一个文件夹里,这样你就可以直接删除整个文件夹?或者能不能设置成用不同的输出文件名,这样就不会出现这个问题?我对Coverage不太熟悉,不过根据你提供的链接,data_file选项可能可以做到其中一项或两项。

1

你不需要对这个进行转义。只需用 <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" 来避免这个问题,但根据我的经验,我知道在路径中使用 . 会给你带来很多麻烦。

撰写回答