2010-08-04 57 views
4

我建立两种解决方案具有的MSBuild:的MSBuild无法删除二进制文件目录

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

看来,这个构建失败,出现错误消息:

无法删除目录“C:\ TeamBuild \团队解决方案\解决方案\二进制文件“。该目录不是空的。

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

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

回答

3

你确定没有observer effect?也就是说,某些东西没有像explorer.exe那样锁定目录:P

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

+0

@Nick我有同样的问题是什么导致它在最后 – 2011-06-16 14:22:52

+0

@Ruben Bartelink,你的意思是观察员的影响? http://en.wikipedia.org/wiki/Observer_effect_(物理) – juFo 2015-03-31 09:07:39

+0

@juFo是的,什么是使用单词我不理解的话:)固定。 – 2015-03-31 14:10:53

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跳过不存在的目录并且不报告错误,所以始终删除所有目录仍然可行。