使用 Nant 0.92(之前是 0.85,结果相同)

我试图在调用 msbuild 后调用 NAnt 中的删除任务来删除除 .dll 文件之外的所有文件(请参阅下面的脚本。我指的是“构建”目标中的删除)。删除任务似乎没有执行。

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

我试过删除所有内容(不使用 exclude 标签),尝试将 failonerror 和 verbose 显式设置为 true。这些都没有区别。我还尝试在删除任务之前使用 sleep 来停止进程,以防 msbuild 中的某些内容没有及时释放文件以进行删除。我试过将删除放到一个单独的目标中,但仍然没有运气。

该命令显然在调用 msbuild 之前起作用,如果尝试从 msbuild 输出目标以外的目录中删除(即复制输出文件,然后删除相关文件),则它在 msbuild 之后起作用。

我确信这是一个太基本的问题而不能成为错误,但我想我还是会问。当然,我会在将文件复制到其他位置删除不需要的内容然后适当移动的同时使用解决方法,但我对此很好奇。

我怀疑,除非这种行为是设计使然(尽管我在 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>

显示构建成功且没有进一步消息的 NAnt 输出摘要:
  [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.

最佳答案

尝试查看 NAnt 源代码 - 很可能 msbuild 任务创建了一个 MSBuild 引擎,之后不会强制它关闭文件。尽管查看 MSDN 文档,但我并没有真正看到一种方法 - MSBuild 构造缺少 Dispose() 函数。在 ProjectInstance 等类上有一个终结器,因此可以通过在应用程序域中运行并随后关闭整个域来强制它释放文件句柄 - 这是相当多的工作。

关于msbuild - Nant 删除任务不会删除 msbuild 后的文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12806729/

10-17 01:03