MSBuild не удается удалить каталог двоичных файлов


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

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

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

Невозможно удалить каталог "c:TeamBuildTeam решениярешения двоичные файлы". Каталог не пуст.

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

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

2 4

2 ответа:

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

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

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

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