Отличный вопрос. Я только что опубликовал очень подробную запись в блоге об этом в средстве веб-развертывания (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). То, что он говорит, - это разместить его в том же относительном месте в пакете, что и в папке Extra Files.
Исключение файлов
Если вы откроете файл проекта веб-приложения, созданного с помощью VS 2010, в его нижней части вы найдете строку с расширением.
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
Кстати, вы можете открыть файл проекта внутри VS. Щелкните правой кнопкой мыши проект и выберите "Выгрузить проект". Затем щелкните правой кнопкой мыши выгруженный проект и выберите «Редактировать проект».
В этом заявлении будут указаны все цели и задачи, которые нам нужны. Большинство наших настроек должно быть после этого импорта, если вы не уверены, что нужно делать это после! Итак, если у вас есть файлы, которые нужно исключить, есть имя элемента ExcludeFromPackageFiles, которое можно использовать для этого. Например, предположим, что у вас есть файл с именем Sample.Debug.xml, который включен в ваше веб-приложение, но вы хотите, чтобы этот файл был исключен из созданных пакетов. Вы можете разместить фрагмент ниже после этого оператора импорта.
<ItemGroup>
<ExcludeFromPackageFiles Include="Sample.Debug.xml">
<FromTarget>Project</FromTarget>
</ExcludeFromPackageFiles>
</ItemGroup>
При объявлении заполнения этого элемента файлы будут автоматически исключены. Обратите внимание на использование FromTarget
метаданных здесь. Я не буду здесь вдаваться в подробности, но вы всегда должны это указывать.
Более простое решение - отредактировать файл csproj, чтобы включить необходимую dll в папку bin, а затем создать цель beforebuild, чтобы скопировать элемент в папку bin из общей папки библиотеки, где мы храним наши сторонние dll. Поскольку элемент существует в файле решения, он развертывается с помощью msbuild / msdeploy, и ничего сложного не требуется.
Тег, используемый для включения файла без добавления через VS (который обычно хочет добавить его в вашу VCS)
Это цель BeforeBuild, которая у меня сработала:
Отредактировано, чтобы включить предложение @ tuespetre скрыть запись, тем самым удалив предыдущую обратную сторону видимой папки bin. Не проверено мной.
источник
<Visible>false</Visible>
скрыть его из обозревателя решений.Так же, как @toxaq, но еще более простое решение:
В обозревателе решений добавьте файл в качестве ссылки на папку библиотеки / ссылок, а затем в свойствах установите его для копирования на вывод сборки.
источник
Так что реализация Сайеда у меня не сработала. Я использую VS2013 и использую пакет Web Deploy, и мне нужно добавить несколько подключаемых библиотек DLL из другой папки в корзину пакета развертывания. Вот как мне удалось заставить его работать (намного проще):
Внизу вашего файла csproj добавьте:
Другие упоминания в файле csproj:
источник
Хотел прокомментировать, чтобы подчеркнуть комментарий Эмиля Лерха выше. Если вы установили Azure SDK, найдите другой DependencyProperty.
По сути, вам может потребоваться использовать «CopyAllFilesToSingleFolderForMsdeployDependsOn вместо« CopyAllFilesToSingleFolderForPackageDependsOn ». Я не совсем продвинутый парень MsBuild, и я потратил часы, вытаскивая волосы, пытаясь определить, почему мои цели не вызываются.
Вот еще одна ссылка, если это не работает для вас и вы установили Azure SDK: http://forums.iis.net/t/1190714.aspx
источник
В качестве дополнения к ответу Сайеда я обнаружил, что статического объявления элементов ExcludeFromPackageFiles в моем проекте недостаточно. Мне нужно было исключить определенные библиотеки DLL, которые были доступны только после компиляции (специфические для Azure модули Ninject, которые не нужны при развертывании в IIS).
Поэтому я попытался создать свой список ExcludeFromPackageFiles, используя трюк CopyAllFilesToSingleFolderForPackageDependsOn Sayed, опубликованный выше. Однако это слишком поздно, так как процесс упаковки уже удалил элементы ExcludeFromPackageFiles. Итак, я использовал ту же технику, но немного раньше:
Надеюсь, это кому-то поможет ...
источник
Кроме того, можно установить файл как Content | Копировать всегда
источник