Как удалить несколько файлов с помощью проекта msbuild / web deploy? - PullRequest
11 голосов
/ 12 мая 2009

У меня странная проблема с тем, как msbuild ведет себя с проектом веб-развертывания VS2008, и хотел бы знать, почему он случайно ведет себя неправильно.

Мне нужно удалить несколько файлов из папки развертывания, которые должны существовать только в моей среде разработки. Файлы были сгенерированы веб-приложением во время разработки / тестирования и не включены в мой проект / решение Visual Studio.

Я использую следующую конфигурацию:

<!--  Partial extract from Microsoft Visual Studio 2008 Web Deployment Project -->
<ItemGroup>
  <DeleteAfterBuild Include="$(OutputPath)data\errors\*.xml" /> <!-- Folder 1: 36 files -->
  <DeleteAfterBuild Include="$(OutputPath)data\logos\*.*" />    <!-- Folder 2: 2 files -->
  <DeleteAfterBuild Include="$(OutputPath)banners\*.*" />       <!-- Folder 3: 1 file -->
</ItemGroup>

<Target Name="AfterBuild">
  <Message Text="------ AfterBuild process starting ------" Importance="high" />
    <Delete Files="@(DeleteAfterBuild)">
      <Output TaskParameter="DeletedFiles" PropertyName="deleted" />
    </Delete>
    <Message Text="DELETED FILES: $(deleted)" Importance="high" />
  <Message Text="------ AfterBuild process complete ------" Importance="high" />
</Target>

Проблема, с которой я столкнулся, заключается в том, что когда я выполняю сборку / перестройку проекта веб-развертывания, он «иногда» удаляет все файлы, но в других случаях ничего не удаляет! Или он удалит только одну или две из трех папок в группе элементов DeleteAfterBuild. Кажется, нет никакой согласованности в том, когда процесс сборки решает удалить файлы или нет.

Когда я отредактировал конфигурацию, включив в нее только папку 1 (например), он удаляет все файлы правильно. Затем, добавив папки 2 и 3, он начинает удалять все файлы, как я хочу. Затем, по-видимому, в случайное время я пересоберу проект, и он не удалит ни один из файлов!

Я пытался переместить эти элементы в группу элементов ExcludeFromBuild (что, вероятно, там, где и должно быть), но это дает мне тот же непредсказуемый результат.

Кто-нибудь испытывал это? Я делаю что-то неправильно? Почему это происходит?

Ответы [ 3 ]

29 голосов
/ 13 мая 2009

<ItemGroup> оценивается, когда скрипт загружается и до обработки <Target>.

Существует несколько способов сделать это правильно -

  1. Включите <ItemGroup> внутри <Target>, и оно должно быть оценено в правильное время. Это будет работать с MS-Build v3.5 +

  2. Используйте <CreateItem> для генерации списка предметов

Пример сценария сборки для этого -

<!-- Using ItemGroup -->
<Target Name="AfterBuild">
  <ItemGroup>
    <DeleteAfterBuild Include="$(OutputPath)data\errors\*.xml" />
  </ItemGroup>
  <Delete Files="@(DeleteAfterBuild)" />
</Target>

<!-- Using CreateItem -->
<Target Name="AfterBuild">
  <CreateItem Include="$(OutputPath)data\errors\*.xml">
    <Output TaskParameter="Include" ItemName="DeleteAfterBuild"/>
  </CreateItem>
  <Delete Files="@(DeleteAfterBuild)" />
</Target>

Чтобы объяснить, почему процесс удаления генерировал «непредсказуемые» результаты -

  1. Начните с чистого пути вывода сборки
  2. Сборка № 1 - сборка проекта веб-развертывания. @(DeleteAfterBuild) будет оцениваться без файлов, поскольку файлы не существуют в папке $(OutputPath), и не удалит никакие файлы как часть AfterBuild target
  3. Сборка № 2 - сборка проекта веб-развертывания. @(DeleteAfterBuild) оценивает все ожидаемые файлы в папке $(OutputPath) и удаляет файлы как часть цели AfterBuild
  4. По сути, мы вернулись к этапу 2. Повторите. Результаты, конечно, предсказуемы - больше не чесай голову.

Справочный материал: Как: создать группы предметов на лету , Задержка оценки элементов в файле MSBUILD

4 голосов
/ 13 мая 2009

Проверьте запись в блоге, которую я только что опубликовал MSBuild: Оценка товара и имущества , думаю, это может помочь Дайте мне знать, если нет.

Сайед Ибрагим Хашими

0 голосов
/ 19 марта 2010

Я понимаю, что на это уже ответили, но я думал, что добавлю свои 5 центов. Для проекта веб-развертывания нет необходимости использовать предоставленные цели, просто добавьте группу элементов, содержащую ExcludeFromBuild элементы. Я предоставил соответствующий раздел в нижней части моего файла проекта развертывания для справки.

  <Import Project="$(MSBuildExtensionsPath)\Microsoft\WebDeployment\v9.0\Microsoft.WebDeployment.targets" />
  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
       Other similar extension points exist, see Microsoft.WebDeployment.targets.
  <Target Name="BeforeBuild">
  </Target>
  <Target Name="BeforeMerge">
  </Target>
  <Target Name="AfterMerge">
  </Target>
  <Target Name="AfterBuild">
  </Target>
  -->
  <ItemGroup>
    <ExcludeFromBuild Include="$(SourceWebPhysicalPath)\obj\**\*.*" />
    <ExcludeFromBuild Include="$(SourceWebPhysicalPath)\Properties\**\*.*" />
    <ExcludeFromBuild Include="$(SourceWebPhysicalPath)\**\*.csproj*" />
    <ExcludeFromBuild Include="$(SourceWebPhysicalPath)\**\*.resx" />
    <ExcludeFromBuild Include="$(SourceWebPhysicalPath)\**\*.Publish.xml" />
    <ExcludeFromBuild Include="$(SourceWebPhysicalPath)\LocalTestRun.testrunconfig" />
    <ExcludeFromBuild Include="$(SourceWebPhysicalPath)\TestResults\**\*.*" />
  </ItemGroup>
...