MSBuild не удается удалить каталог Binaries - PullRequest
4 голосов
/ 04 августа 2010

Я строю два решения с MSBuild:

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

Похоже, что эта сборка завершается с сообщением об ошибке:

Невозможно удалить каталог "c: \ TeamBuild \ Team Solutions \ Solution \ Binaries". Каталог не пустой.

Похоже, что MSBuild создает этот каталог 'Binaries' по умолчанию, и сборка проходит. Когда я строю снова, сборка завершается с сообщением выше. Если я попробую третью сборку .. она снова заработает.

Может кто-нибудь сказать мне, как обеспечить, чтобы его папка удалялась / перезаписывалась каждый раз?

Ответы [ 2 ]

3 голосов
/ 05 августа 2010

Вы уверены, что в игре нет эффекта наблюдателя ? то есть что-то не блокирует каталог, например explorer.exe: P

Вы можете исключить это, используя \\live.sysinternals.com\procmon.exe (чтобы узнать, кто что делает с директорией) и procxp (чтобы узнать, кто его блокирует).

0 голосов
/ 30 июня 2015

Я столкнулся с той же проблемой, что и "Невозможно удалить каталог ... каталог не пустой" при запуске цели, которая выглядит примерно так:

 <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 пропускает несуществующие каталоги и не сообщает об ошибке.

...