我的构建脚本中有以下清理函数,我想知道如何改进它。
<target name="clean" description="Clean output directories.">
<!-- Must not fail on error because it fails if directories don't exist.
Is there really no better way to do this? -->
<delete includeEmptyDirs="true" failonerror="false">
<fileset dir="${main.build.directory}" />
<fileset dir="dist" />
<fileset dir="${documentation.build.directory}" />
<fileset dir="/build-testing" />
</delete>
</target>
特别是关于我的评论,我不满意我无法在新盒子上运行它,因为其他目标尚未设置目录结构。我们以这样的方式运行构建,即它每次都完全重新创建测试和部署所需的结构,以避免过时的类文件等。使用当前设置删除的方式,删除文件失败不会使构建失败,我希望它能够。如果文件不存在,我不希望它失败。如果它不存在那么我要求它做的事情已经发生了。
思想?
答案 0 :(得分:9)
via Michael's answer,这是我所需要的90%,但不是那么完整。
由于您的回答,我最终得到的实际解决方案如下:
<target name="clean" description="Clean output directories.">
<!-- Must not fail on error because it fails if directories don't exist.
Is there really no better way to do this? -->
<delete includeEmptyDirs="true" failonerror="false">
<fileset dir="${main.build.directory}" />
...
</delete>
<available
file="${main.build.directory}"
type="dir"
property="delete-main-failure" /> ...
<condition property="delete-failure">
<and>
<isset property="delete-main-failure" /> ...
</and>
</condition>
<fail
if="delete-failure"
message="Unable to delete previous build's directories." />
</target>
这符合我的标准,即代码会尝试删除它,如果它仍然存在则会失败。虽然这很丑陋。删除任务的默认行为让我非常奇怪。我认为理由是,如果你试图删除某些内容并且它不存在,则必然会出现问题,但在我看来,正常的情况是,如果它不存在,那么你就不会这样做。关心,因为它已经消失,而奇怪的情况是你需要它在那里,但现在它不应该在构建的这个特定阶段。
答案 1 :(得分:5)
我来这里问同样的问题......看起来没有一种优雅的方法可以解决这个问题。当我想保持代码清洁时,我这样做:
<mkdir dir="${main.build.directory}" />
<delete dir="${main.build.directory}" failonerror="true" />
我认为删除任务没有“if”属性。将不得不检查出来。