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

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

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

4b9b3361

Отличный вопрос. Я просто разместил очень подробный блог о нем на Инструмент веб-развертывания (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. Я не буду вдаваться в это здесь, но вы должны знать, чтобы всегда указывать это.

158
ответ дан 01 мая '10 в 6:15
источник

Более простым решением является отредактировать файл csproj, чтобы включить требуемую DLL в папку bin, а затем создать цель передстройки, чтобы скопировать элемент в папку bin из общей папки библиотеки, где мы храним наши DLL файлы сторонних разработчиков. Поскольку элемент существует в файле решения, он развертывается с помощью msbuild/msdeploy и ничего сложного не требуется.

Тег, используемый для включения файла без добавления через VS (который обычно хочет добавить его в ваш VCS)

<Content Include="Bin\3rdPartyNative.dll" ><Visible>false</Visible></Content>

Это цель BeforeBuild, которая работала для меня:

<Target Name="BeforeBuild">
    <Message Text="Copy $(SolutionDir)Library\3rdPartyNative.dll to '$(TargetDir)'3rdPartyNative.dll" Importance="high" />
    <Copy SourceFiles="$(SolutionDir)Library\3rdPartyNative.dll" DestinationFiles="$(TargetDir)3rdPartyNative.dll" />
</Target>

Отредактировано, чтобы включить предложение @tuespetre, чтобы скрыть запись, удалив предыдущий недостаток папки с видимым бипом. Непроверено мной.

20
ответ дан 16 апр. '11 в 8:49
источник

Как и @toxaq, но еще более простое решение:

В обозревателе решений добавьте файл в качестве ссылки на папку библиотеки/ссылок, а затем в свойствах задайте его для копирования на вывод сборки.

7
ответ дан 15 мая '11 в 6:13
источник

Хотел прокомментировать, чтобы подчеркнуть комментарий Эмиля Лерха выше. Если вы установили Azure SDK, найдите другой DependencyProperty.

В принципе, вам может потребоваться использовать "CopyAllFilesToSingleFolderForMsdeployDependsOn" вместо "CopyAllFilesToSingleFolderForPackageDependsOn". Я не очень продвинутый парень MsBuild, и я потратил несколько часов на то, чтобы вытащить мои волосы, пытаясь определить, почему мои цели не вызываются.

Вот еще одна ссылка, если это не работает для вас, и вы установили Azure SDK: http://forums.iis.net/t/1190714.aspx

5
ответ дан 17 нояб. '12 в 6:43
источник

Реализация So Sayed для меня не работала. Я использую VS2013 и использую пакет Web Deploy, и вам нужно добавить некоторые DLL-модули из другой папки в корзину пакета развертывания. Вот как мне удалось заставить его работать (намного проще):

В нижней части файла 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" />
4
ответ дан 08 апр. '15 в 3:12
источник

Как добавление к ответу Sayed, я обнаружил, что статического объявления элементов ExcludeFromPackageFiles в моем проекте было недостаточно. Мне нужно было исключить определенные библиотеки DLL, которые были доступны только после компиляции (Azure для конкретных модулей Ninject, которые не нужны при развертывании в IIS).

Итак, я попытался подключиться к генерации моего списка ExcludeFromPackageFiles, используя трюк CopyAllFilesToSingleFolderForPackageDependsOn, сказанный выше. Однако это слишком поздно, так как процесс упаковки уже удалил элементы 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>

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

3
ответ дан 12 мая '11 в 15:57
источник