2010-08-04 59 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跳過不存在的目錄並且不報告錯誤,所以始終刪除所有目錄仍然可行。