Как включить дополнительные файлы с помощью пакетов веб-развертывания VS2010?


Я тестирую использование новой функции веб-упаковки в visual studio 2010 и столкнулся с ситуацией, когда я использую событие предварительной сборки для копирования .dll находится в моей папке bin, на которую мое приложение полагается для вызовов API. Они не могут быть включены в качестве ссылки, так как они не являются com DLL, которые могут быть использованы с interop.

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

6 123

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>

надеюсь, что это кому-то поможет...