Как получить функциональность Visual Studio «Опубликовать» для включения файлов из события после сборки? - PullRequest
87 голосов
/ 29 июня 2010

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

Я занимаюсь разработкой в ​​32-битной среде, но мне нужно создать пакет выпуска для 64-битной среды, поэтому в конфигурации 'Release' у меня есть событие после сборки, которое копирует 64-битную версию стороннего dll в перезапись каталога bin 32-битная версия. Когда я использую функциональность «Публикация», хотя правильная 64-битная DLL копируется в каталог bin, она не включается в пакет.

Есть ли способ заставить 'Publish' включать файлы, которые были скопированы в каталог bin во время события после сборки?

Ответы [ 6 ]

87 голосов
/ 30 июня 2010

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

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


От: Как включить дополнительные файлы с помощью пакетов веб-развертывания 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, в нижней части, вы увидите строку с *. 1037 *

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

13 голосов
/ 29 июня 2010

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

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

  1. Изменить настройки проекта "Упаковать / опубликовать в Интернете" и
    выберите «Элементы для развертывания» как «Все файлы в этой папке проекта»
  2. Выгрузить проект
  3. Щелкните правой кнопкой мыши на незагруженном проекте и выберите для редактирования конфигурации проекта
  4. Найдите элемент PropertyGroup, связанный с настройкой конфигурации, например, "Release"
  5. В элементе PropertyGroup добавьте следующие элементы и исключите файлы и папки, которые вам не нужны в пакете

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

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

4 голосов
/ 29 января 2014

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

1 голос
/ 22 апреля 2018

Я знаю, это старый вопрос, но ни один из них не сработал для меня.

В 2017 году VS я просто щелкнул правой кнопкой мыши по дополнительной папке, которую нужно опубликовать, и выбрал опубликовать, это сработало.

Пример:

enter image description here

0 голосов
/ 25 сентября 2018

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

Почти все статьи о включении дополнительных файлов в вашу публикацию используют этот метод добавления элементов CopyAllFilesToSingleFolderForPackageDependsOn или CopyAllFilesToSingleFolderForMSDeployDependsOn в PropertyGroup, и все они примерно одинаковы: «Я добавил это в конец файла. .. "

Это то, что я сделал и провел во второй половине дня, пытаясь выяснить, почему ничего не происходит, пока не понял, что в верхней части файла уже есть раздел PropertyGroup. Когда я положил CopyAllFilesToSingleFolderForPackageDependsOn в этот раздел, он работал нормально.

Надеюсь, это когда-нибудь сэкономит кому-то время

0 голосов
/ 17 марта 2017

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

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

При этом использовалась Visual Studio 2015 Professional

...