我正在使用MSBuild构建两个解决方案:
<ItemGroup>
<SolutionToBuild Include="$(BuildProjectFolderPath)/HostASPX/SolutionA.sln"/>
<SolutionToBuild Include="$(BuildProjectFolderPath)/../Installer/SolutionB.sln"/>
</ItemGroup>
似乎此版本失败并显示错误消息:
无法删除目录“c:\ TeamBuild \ Team Solutions \ Solution \ Binaries”。该目录不为空。
MSBuild似乎默认创建了这个'Binaries'目录,并且构建通过了。当我再次构建时,构建失败并显示上述消息。如果我尝试第三次构建......它再次起作用。
有人可以告诉我如何确保每次删除/覆盖他的文件夹吗?
答案 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会跳过不存在的目录并且不报告错误。