MSBuild无法删除Binaries目录

时间:2010-08-04 15:10:51

标签: tfs build msbuild build-process

我正在使用MSBuild构建两个解决方案:

<ItemGroup> 
    <SolutionToBuild Include="$(BuildProjectFolderPath)/HostASPX/SolutionA.sln"/>    
    <SolutionToBuild Include="$(BuildProjectFolderPath)/../Installer/SolutionB.sln"/>     
  </ItemGroup>  

似乎此版本失败并显示错误消息:

  

无法删除目录“c:\ TeamBuild \ Team Solutions \ Solution \ Binaries”。该目录不为空。

MSBuild似乎默认创建了这个'Binaries'目录,并且构建通过了。当我再次构建时,构建失败并显示上述消息。如果我尝试第三次构建......它再次起作用。

有人可以告诉我如何确保每次删除/覆盖他的文件夹吗?

2 个答案:

答案 0 :(得分:3)

你确定没有observer effect在玩吗?即某些东西没有像explorer.exe那样锁定目录:P

您可以使用\\live.sysinternals.com\procmon.exe(找出谁在为dir做什么)和procexp(找出谁锁定它)来排除它。

答案 1 :(得分:0)

我遇到了同样的问题“无法删除目录...目录不为空”,同时运行看起来像这样的目标:

 <Target Name="CleanFiles"
    DependsOnTargets="Prepare_Files"
    Inputs="@(Files->'%(OutputPath)'->Distinct())"
    Outputs="_Non_Existent_Item_To_Batch_">

    <ItemGroup>
      <DirsToDelete Include="@(Files->'%(OutputPath)'->Distinct())"/>      
    </ItemGroup>

    <RemoveDir Directories="@(DirsToDelete)"/>

  </Target>

偶尔它工作正常并删除了目录,但我经常得到上面的错误。

最终我发现 MSBuild本身正在锁定文件,因为它们出现在目标的“输入”上,并且没有及时解锁它们以便RemoveDir删除它们。
将上述内容更改为:

 <Target Name="CleanFiles"
    DependsOnTargets="Prepare_Files">

    <ItemGroup>
      <DirsToDelete Include="@(Files->'%(OutputPath)'->Distinct())"/>      
    </ItemGroup>

    <RemoveDir Directories="@(DirsToDelete)"/>

  </Target>

似乎解决了这个问题。

删除所有目录仍然可以,因为RemoveDir会跳过不存在的目录并且不报告错误。