Как заставить Visual Studio "публиковать" функциональность включать файлы из события post build?

В настоящее время я пытаюсь использовать функции Visual Studio 2010 "Публиковать" и MSDeploy для удовлетворения моих потребностей в веб-развертывании, но столкнулся с препятствием в отношении настройки пакета в зависимости от конфигурации сборки.

Я разрабатываю в 32-битной среде, но мне нужно создать пакет релиза для 64-битной среды, поэтому в конфигурации "Release" у меня есть событие post build, которое копирует 64-разрядную версию сторонней DLL в переписывание каталога bin 32-битная версия. Когда я использую функцию "Опубликовать", хотя правильная 64-битная dll копируется в каталог bin, она не входит в пакет.

Есть ли способ заставить "Опубликовать" включить файлы, которые были скопированы в каталог bin во время события post build?

Ответ 1

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

В вашем сценарии вы используете событие post build, я бы рекомендовал удалить событие post build и реализовать ваши действия, используя ваши собственные цели MSBuild, а не post post event. Ниже вы найдете текст другого ответа.


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


Отличный вопрос. Я просто разместил очень подробный блог о нем на Инструмент веб-развертывания (MSDeploy): сборка пакета, включая дополнительные файлы или исключение определенных файлов.

Вот краткий обзор. После включения файлов я также покажу, как исключать файлы.

Включение дополнительных файлов

Включение дополнительных файлов в пакет немного сложнее, но по-прежнему не важно, если вам удобно с MSBuild, и если вы не читаете это. Для этого нам нужно подключиться к той части процесса, которая собирает файлы для упаковки. Цель, которую нам нужно расширить, называется CopyAllFilesToSingleFolder. Эта цель имеет свойство зависимости, PipelinePreDeployCopyAllFilesToOneFolderDependsOn, которое мы можем задействовать и внедрить в нашу собственную цель. Таким образом, мы создадим объект с именем CustomCollectFiles и добавим его в этот процесс. Мы достигаем этого со следующим (помните после оператора импорта).

<PropertyGroup>
  <CopyAllFilesToSingleFolderForPackageDependsOn>
    CustomCollectFiles;
    $(CopyAllFilesToSingleFolderForPackageDependsOn);
  </CopyAllFilesToSingleFolderForPackageDependsOn>
</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, чтобы он взял все файлы в этой папке и любую папку под ним. Затем я использую этот элемент для заполнения элемента 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. Я не буду вдаваться в это здесь, но вы должны знать, чтобы всегда указывать это.

Ответ 2

Я нашел обходное решение проблемы, используя элемент ExcludeFilesFromDeployment в файле проекта. Я получил идею от Развертывание веб-сайтов: исключая файлы и папки

Итак, если вам нужно упаковать файлы проекта, как они существуют в каталоге проекта, после успешной сборки и связанных с ними шагов пост-сборки, выполните следующие действия.

  • Изменить настройки проекта "Пакет/Опубликовать веб-сайт" и
    выберите "Элементы для развертывания" "Все файлы в этой папке проекта"
  • Выгрузить проект
  • Щелкните правой кнопкой мыши на выгруженном проекте и выберите, чтобы отредактировать конфигурацию проекта
  • Найдите элемент PropertyGroup, связанный с настройкой конфигурации, например. "Release"
  • В элементе PropertyGroup добавьте следующие элементы и исключите файлы и папки, которые вы не хотите в пакете

    <ExcludeFilesFromDeployment>*.cs;**\.svn\**\*.*;Web.*.config;*.csproj*</ExcludeFilesFromDeployment>
    <ExcludeFoldersFromDeployment>.svn;Controllers;BootstrapperTasks;Properties</ExcludeFoldersFromDeployment>
    
  • Сохраните и перезагрузите проект

Это решает мою проблему на данный момент, но если есть лучшее решение, сообщите мне, потому что это не идеальное из-за хакерства, но опять же, возможно, это необычный сценарий развертывания?

Ответ 3

Выберите ваши файлы или папки и измените действие "Действие" как "Содержимое из окна свойств".

Ответ 4

Добавление папки bin (и ее содержимого) в проект привело к копированию файлов в каталог публикации публикации.

Для меня проблема заключалась в том, что мне нужно было поместить файл лицензии на программное обеспечение в папку bin/, но не нужно было вручную копировать каждое развертывание.

Это использовало Visual Studio 2015 Professional