Nant删除任务无法在msbuild后删除文件

4

使用 NAnt 0.92(之前版本为 0.85,出现同样的结果)

我正在尝试在 NAnt 中调用 delete 任务,在调用 msbuild 后删除除 .dll 文件之外的所有文件(请参见下面的脚本..我指的是“build”目标中的 delete)。但是 delete 任务似乎没有执行。

初始的 delete 任务可以正常工作,并按预期运行,从指定的构建目录中删除所有文件。然而,在编译后的第二个 delete 任务不起作用。

我尝试过直接删除所有内容(不使用 exclude 标记),并尝试显式设置 failonerrorverbosetrue。但这些都没有任何区别。我还尝试使用 sleepdelete 任务之前停止进程,以防 msbuild 中的某些东西未能及时释放文件以进行删除。我尝试将删除放入单独的目标中,但仍然无济于事。

很明显,在调用 msbuild 之前该命令起作用,如果尝试从与 msbuild 输出目标不同的目录中删除,则在调用 msbuild 后它也能正常工作(即复制输出文件,然后删除相关文件)。

我确信这个问题太基础了,不可能是一个 bug,但我还是想问一下。当然,与此同时,我将使用复制文件到不同位置的解决方法,删除不需要的文件,然后适当移动,但我对此很好奇。

我怀疑,除非这种行为是经过设计的(尽管我在 NAnt 文档中找不到任何建议),否则 msbuild 进程会锁定输出文件,直到 NAnt 进程完成?这是我的最佳猜测。如果有更多见解,欢迎指教。

编辑:此外,如果我显式设置 msbuild 的 \OutputPath 开关,则不会出现相同的问题。仅在使用默认 OutputPath 时才会出现问题。

NAnt 构建文件:

<?xml version="1.0" encoding="utf-8" ?>
<project name="Reports.TestBench.PreBuild" default="postbuild.cleanup" basedir="." xmlns="http://nant.sourceforge.net/release/0.86-beta1/nant.xsd">
    <property name="nant.settings.currentframework" value="net-4.0" />
    <property name="project.StandardReports" value="${project::get-base-directory()}\Reports.StandardReports\Palladium.Reports.StandardReports.csproj" />
    <property name="output.Dir" value="${project::get-base-directory()}\bin\debug\"/>
    <property name="build.Type" value="debug"/>

    <!--Deletes the pre-existing build files-->
    <target name="clean">
        <delete>
          <fileset basedir="${output.Dir}">
            <include name="*.*" />  
          </fileset>
        </delete>
    </target>

    <!--Builds the projects to the specified build directory-->
    <target name="build" depends="clean" description="Build the Palladium Reports Standard Reports application">
        <msbuild project="${project.StandardReports}">
            <arg value="/p:Configuration=${build.Type}" />
            <!--arg value="/p:OutputPath=${path::get-full-path(buildDir.Client)}\Reports" /-->
            <arg value="/t:Rebuild" />
        </msbuild>

        <delete failonerror="true" verbose="true">
          <fileset basedir="${output.Dir}">
            <include name="*.*" />
            <exclude name="Palladium.Reports.StandardReports.dll" />
          </fileset>
        </delete>
    </target>
</project>
< p > NAnt输出摘要显示构建成功且没有进一步消息:< /p >
  [msbuild] Build succeeded.
  [msbuild]     0 Warning(s)
  [msbuild]     0 Error(s)
  [msbuild] 
  [msbuild] Time Elapsed 00:00:03.19

BUILD SUCCEEDED

Total time: 3.5 seconds.

你能否尝试将msbuild更改为文件复制,这样流程就是删除、复制、删除?如果可以的话,那么我们就知道问题确实与msbuild任务有关。 - Mightymuke
1个回答

0

尝试研究NAnt源代码-最有可能是msbuild任务创建了一个MSBuild引擎,但没有强制关闭文件。虽然看MSDN文档时,我真的看不到如何做到这一点-MSBuild结构缺少Dispose()函数。像ProjectInstance之类的类上有一个终结器,所以可以通过在应用程序域中运行并在此后关闭整个域来强制释放文件句柄-那是相当麻烦的。


在创建标签维基时,请在批量复制文本的末尾注明来源。您已经因为剽窃文本而被拒绝了许多建议,例如这个链接:http://stackoverflow.com/review/suggested-edits/796373。请注意注明出处。 - LittleBobbyTables - Au Revoir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接