Как включить дополнительные файлы с помощью пакетов веб-развертывания VS2010?
Я тестирую использование новой функции веб-упаковки в visual studio 2010 и столкнулся с ситуацией, когда я использую событие предварительной сборки для копирования .dll находится в моей папке bin, на которую мое приложение полагается для вызовов API. Они не могут быть включены в качестве ссылки, так как они не являются com DLL, которые могут быть использованы с interop.
когда я создаю свой пакет развертывания, эти файлы исключаются, когда я выбираю опцию включения только файлов, необходимых для запуска приложения. Есть ли способ чтобы настроить параметры развертывания для включения этих файлов? Мне не удалось найти хорошую документацию по этому вопросу.
6 ответов:
большой вопрос. Я только что опубликовал очень подробную запись в блоге об этом на Web Deployment Tool (MSDeploy): сборка пакета, включая дополнительные файлы или исключая определенные файлы.
вот краткий обзор. После включения файлов, я покажу, как исключить файлы, а также.
, Включая Дополнительные Файлы
включение дополнительных файлов в пакет немного сложнее, но все же не bigee, если вам удобно с 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 сказал ему забрать все файлы в этой папке и любой папке под ним. Если вам нужно исключить что-то из этого списка, добавьте до
_CustomFiles
.затем я использую этот элемент для заполнения элемента FilesForPackagingFromProject. Это элемент, который MSDeploy фактически использует для добавления дополнительных файлов. Также обратите внимание, что я объявил метаданные DestinationRelativePath значение. Это определит относительный путь, по которому он будет помещен в пакет. Я использовал формулировку дополнительных Файлы%(RecursiveDir)%(Filename)%(Extension) здесь. То, что это говорит, чтобы поместить его в том же относительном месте в пакете, как это находится в папке дополнительных файлов.
исключение файлов
если вы откроете файл проекта веб-приложения, созданного с помощью VS 2010, в нижней части его вы найдете строку С.
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
кстати, вы можете открыть файл проекта внутри против. Щелкните правой кнопкой мыши на проекте выберите выгрузить проект. Тогда направо нажмите на выгруженный проект и выберите Редактировать проект.
это заявление будет включать в себя все цели и задачи, которые нам нужны. Большинство наших настроек должны быть после этого импорта,если вы не уверены, если после! Поэтому, если у вас есть файлы для исключения, есть имя элемента ExcludeFromPackageFiles, которое можно использовать для этого. Например предположим, что у вас есть файл с именем sample.Отлаживать.js, который включен в ваше веб-приложение, но вы хотите, чтобы этот файл был исключен из созданного пакеты. Вы можете разместить фрагмент ниже после этого оператора импорта.
<ItemGroup> <ExcludeFromPackageFiles Include="Sample.Debug.xml"> <FromTarget>Project</FromTarget> </ExcludeFromPackageFiles> </ItemGroup>
при объявлении заполнения этого пункта файлы будут автоматически исключены. Обратите внимание на использование метаданных FromTarget здесь. Я не буду вдаваться в это здесь, но вы должны знать, чтобы всегда указывать это.
более простое решение-отредактировать файл csproj, чтобы включить необходимую dll в папку bin, а затем создать цель beforebuild для копирования элемента в папку bin из общей папки библиотеки, где мы храним наши сторонние DLL. Поскольку элемент существует в файле решения, он развертывается msbuild/msdeploy, и ничего сложного не требуется.
тег используется для включения файла без добавления через VS (который захочет добавить его в ваш VCS обычно)
<Content Include="BinrdPartyNative.dll" ><Visible>false</Visible></Content>
это цель BeforeBuild, которая работала для меня:
<Target Name="BeforeBuild"> <Message Text="Copy $(SolutionDir)LibraryrdPartyNative.dll to '$(TargetDir)'3rdPartyNative.dll" Importance="high" /> <Copy SourceFiles="$(SolutionDir)LibraryrdPartyNative.dll" DestinationFiles="$(TargetDir)3rdPartyNative.dll" /> </Target>
отредактировано, чтобы включить предложение @tuespetre, чтобы скрыть запись, тем самым удалив предыдущую обратную сторону видимой папки bin. Не проверено мной.
Так же, как @toxaq, но еще более простым решением является:
в обозревателе решений добавьте файл в качестве ссылки на папку Библиотека/ссылки, а затем в свойствах установите его для копирования в выходные данные сборки.
Так что реализация Sayed не сработала для меня. Я использую VS2013 и использую пакет Web Deploy и должен добавить некоторые библиотеки DLL плагинов из другой папки в корзину пакета deploy. Вот как мне удалось заставить его работать (намного проще):
в нижней части вашего файла csproj добавить:
<Target Name="AdditionalFilesForPackage" AfterTargets="CopyAllFilesToSingleFolderForMsdeploy"> <ItemGroup> <Files Include="..\SomeOtherProject\bin$(Configuration)\*.*"/> </ItemGroup> <Copy SourceFiles="@(Files)" DestinationFolder="$(_PackageTempDir)\bin\" /> </Target>
другие упоминания в файле csproj:
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> <DebugType>pdbonly</DebugType> <Optimize>true</Optimize> <OutputPath>bin\</OutputPath> <DefineConstants>TRACE</DefineConstants> <ErrorReport>prompt</ErrorReport> <WarningLevel>4</WarningLevel> <DeployOnBuild>true</DeployOnBuild> <DeployTarget>Package</DeployTarget> <DeployIisAppPath>Default Web Site/MyWebsite</DeployIisAppPath> <DesktopBuildPackageLocation>..\output\Service\Service\Service.Release.zip</DesktopBuildPackageLocation> <FilesToIncludeForPublish>OnlyFilesToRunTheApp</FilesToIncludeForPublish> <ExcludeGeneratedDebugSymbol>true</ExcludeGeneratedDebugSymbol> <PublishDatabases>false</PublishDatabases> </PropertyGroup> <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v12.0\WebApplications\Microsoft.WebApplication.targets" />
хотел прокомментировать, чтобы подчеркнуть комментарий Эмиля Лерха выше. Если вы установили пакет SDK Azure, найдите другое свойство DependencyProperty.
в принципе, вам может потребоваться использовать "CopyAllFilesToSingleFolderForMsdeploydependson вместо "CopyAllFilesToSingleFolderForPackagedependson". Я не очень продвинутый парень MsBuild, и я потратил часы, вытаскивая волосы, пытаясь определить, почему мои цели не были вызваны.
вот еще одна ссылка, Если это делает не работает для вас, и вы установили Azure SDK: http://forums.iis.net/t/1190714.aspx
в качестве дополнения к ответу Sayed я обнаружил, что статического объявления элементов ExcludeFromPackageFiles в моем проекте было недостаточно. Мне нужно было исключить некоторые DLL, которые были доступны только после compile (специальные модули Ninject для Azure, которые не нужны при развертывании в IIS).
поэтому я попытался подключиться к созданию моего списка ExcludeFromPackageFiles с помощью CopyAllFilesToSingleFolderForPackagedependson trick Sayed, опубликованного выше. Впрочем, это тоже поздно, поскольку процесс упаковки уже удалил элементы ExcludeFromPackageFiles. Итак, я использовал ту же технику, но немного раньше:
<PropertyGroup> <ExcludeFilesFromPackageDependsOn> $(ExcludeFilesFromPackageDependsOn); _ExcludeAzureDlls </ExcludeFilesFromPackageDependsOn> </PropertyGroup> <Target Name="_ExcludeAzureDlls"> <ItemGroup> <FilesForPackagingFromProjectWithNoAzure Include="@(FilesForPackagingFromProject)" Exclude="%(RootDir)%(Directory)*Azure*.dll" /> <AzureFiles Include="@(FilesForPackagingFromProject)" Exclude="@(FilesForPackagingFromProjectWithNoAzure)" /> <ExcludeFromPackageFiles Include="@(AzureFiles)"> <FromTarget>_ExcludeAzureEnvironmentDlls</FromTarget> </ExcludeFromPackageFiles> </ItemGroup> </Target>
надеюсь, что это кому-то поможет...