Как предотвратить копирование скрытой папки .svn из папки _bin_deployableAssemblies? - PullRequest
4 голосов
/ 02 августа 2011

Я использую папку _bin_deployableAssemblies для копирования узлов ASP.NET MVC в папку bin после каждой сборки.К сожалению, задача MSBuild также копирует скрытую папку .svn.

Первая попытка исправить

Я хочу решить эту проблему на уровне проекта, поэтому я добавил задачу RemoveDir к цели AfterBuild в файле .csproj, которая работает длянормальные сборки.

<RemoveDir Directories="@(OutDir).svn" />

Но, кажется, это не работает, когда я публикую сайт.После публикации папка .svn копируется в целевую папку мастера публикации.И как ни странно, он также попадает в папку / bin в проекте, несмотря на задачу RemoveDir!

В файле целей C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets группа элементов создается динамически, чтобы включить все файлы в папку _bin_deployableAssemblies:

<CreateItem Include="$(MSBuildProjectDirectory)\_bin_deployableAssemblies\**\*.*" 
            Condition="Exists('$(MSBuildProjectDirectory)\_bin_deployableAssemblies')">
    <Output ItemName="_binDeployableAssemblies" TaskParameter="Include"/>
</CreateItem>

Используя задачу Message в цели AfterBuild, я вижу, что эта группа элементов включает все файлы в папке .svn.

Вторая попытка исправить

Итак, я попробовал следующий трюк для настройки группы элементов в цели .AfterBuild:

<ItemGroup>
    <_binDeployableAssemblies Remove="$(MSBuildProjectDirectory)\_bin_deployableAssemblies\.svn\**\*.*" />
</ItemGroup>

Если я распечатываю список файлов послечто при использовании задачи Message я вижу, что она больше не включает файлы в папке .svn. Но , файлы .svn по-прежнему копируются в выходную папку при сборке или публикации!

Возможное фактическое исправление

Кажется, что команда Publish сначала выполняет обычную сборку, в этот момент мы можем удалить файлы, используя цель AfterBuild.Но затем он собирается скопировать файлы во временную папку (в папку / obj), чтобы опубликовать их.На этом этапе кажется, что он копирует все из _bin_deployableAssemblies в bin снова и только затем копирует bin (и другие файлы проекта) во временную папку.Кажется, это происходит после AfterBuild.

Таким образом, хитрость может заключаться в том, чтобы подключиться к процессу где-нибудь до того, как файлы проекта будут скопированы во временную папку.Или после этого, но затем необходимо очистить не только временную папку, но и исходную папку bin.Это можно сделать, подключившись к одной из множества целей DependsOn.

Если подходящей цели для этого нет, то, возможно, удаление файлов из некоторой группы элементов-посредников может быть решением, поэтому они никогда не будут скопированы.или опубликовано.

Мне не удалось выполнить ни одно из этих возможных исправлений из-за недостаточного понимания процесса публикации.

Основной вопрос

Как можно предотвратить копирование файлов или удалить файлы после их копирования?Как я могу сделать это как для обычных сборок, так и для команды публикации?

1 Ответ

5 голосов
/ 05 августа 2011

Добавьте это в ваш файл .csproj (или в файл {projectName}.wpp.targets):

  <PropertyGroup>
    <OnAfterCopyAllFilesToSingleFolderForPackage>
      __RemoveSvnFromPackageTemp
    </OnAfterCopyAllFilesToSingleFolderForPackage>
  </PropertyGroup>

  <Target Name="__RemoveSvnFromBin" AfterTargets="_CopyBinDeployableAssemblies">
    <Message Text="Removing .SVN from BIN" Importance="normal"/>
    <RemoveDir Directories="$(OutDir).svn" />
  </Target>

  <Target Name="__RemoveSvnFromPackageTemp">
    <Message Text="Removing .SVN from PackageTempDir" Importance="normal"/>
    <RemoveDir Directories="$(_PackageTempDir)\bin\.svn" />
  </Target>

Это работает для сборки, упаковки и публикации!

...