Отличный вопрос. Я только что опубликовал очень подробную запись в блоге об этом на Инструмент веб-развертывания (MSDeploy): пакет сборки, включающий дополнительные файлы или исключая определенные файлы .
Вот краткий обзор. После включения файлов я покажу, как исключить файлы.
Включая дополнительные файлы
Включение дополнительных файлов в пакет немного сложнее, но все равно нет смысла, если вы знакомы с MSBuild, а если нет, то прочитайте это. Для этого нам нужно подключиться к той части процесса, которая собирает файлы для упаковки. Цель, которую нам нужно расширить, называется CopyAllFilesToSingleFolder. У этой цели есть свойство зависимости PipelinePreDeployCopyAllFilesToOneFolderDependsOn, к которому мы можем подключиться и внедрить нашу собственную цель. Поэтому мы создадим цель с именем CustomCollectFiles и добавим ее в процесс. Мы достигаем этого с помощью следующего (помните после оператора импорта).
<PropertyGroup>
<CopyAllFilesToSingleFolderForPackageDependsOn>
CustomCollectFiles;
$(CopyAllFilesToSingleFolderForPackageDependsOn);
</CopyAllFilesToSingleFolderForPackageDependsOn>
<CopyAllFilesToSingleFolderForMsdeployDependsOn>
CustomCollectFiles;
$(CopyAllFilesToSingleFolderForMsdeployDependsOn);
</CopyAllFilesToSingleFolderForMsdeployDependsOn>
</PropertyGroup>
Это добавит нашу цель к процессу, теперь нам нужно определить саму цель. Предположим, у вас есть папка с именем Extra Files, которая находится на 1 уровень выше вашего веб-проекта. Вы хотите включить все эти файлы. Вот цель CustomCollectFiles, и мы обсудим после этого.
<Target Name="CustomCollectFiles">
<ItemGroup>
<_CustomFiles Include="..\Extra Files\**\*" />
<FilesForPackagingFromProject Include="%(_CustomFiles.Identity)">
<DestinationRelativePath>Extra Files\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
</FilesForPackagingFromProject>
</ItemGroup>
</Target>
Здесь я создал элемент _CustomFiles и в атрибуте Include сказал ему выбрать все файлы в этой папке и любую папку под ней. Если по какой-либо причине вам нужно исключить что-то из этого списка, добавьте атрибут Exclude
к _CustomFiles
.
Затем я использую этот элемент для заполнения элемента FilesForPackagingFromProject. Это элемент, который MSDeploy фактически использует для добавления дополнительных файлов. Также обратите внимание, что я объявил значение метаданных DestinationRelativePath. Это определит относительный путь, по которому он будет помещен в пакет. Я использовал выражение Extra Files% (RecursiveDir)% (Filename)% (Extension) здесь. Это означает, что он должен находиться в том же относительном месте в пакете, что и в папке «Дополнительные файлы».
Исключая файлы
Если вы откроете файл проекта веб-приложения, созданного с помощью VS 2010, в нижней его части, вы увидите строку с
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
Кстати, вы можете открыть файл проекта внутри VS. Щелкните правой кнопкой мыши по проекту и выберите «Выгрузить проект». Затем щелкните правой кнопкой мыши на незагруженном проекте и выберите «Редактировать проект».
Это утверждение будет включать все цели и задачи, которые нам нужны. Большинство наших настроек должны быть после этого импорта, если вы не уверены, что если после! Так что если у вас есть файлы для исключения, есть имя элемента, ExcludeFromPackageFiles, которое можно использовать для этого. Например, допустим, у вас есть файл с именем Sample.Debug.js, который включен в ваше веб-приложение, но вы хотите, чтобы этот файл был исключен из созданных пакетов. Вы можете разместить фрагмент ниже после этого оператора импорта.
<ItemGroup>
<ExcludeFromPackageFiles Include="Sample.Debug.xml">
<FromTarget>Project</FromTarget>
</ExcludeFromPackageFiles>
</ItemGroup>
При объявлении заполнения этого элемента файлы будут автоматически исключены. Обратите внимание на использование метаданных FromTarget здесь. Я не буду вдаваться в подробности, но вы должны всегда это указывать.