Как получить функцию публикации Visual Studio для включения файлов из события пост-сборки?

90

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

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

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

Brodie
источник
1
Если вместо этого вы используете событие предварительной сборки, похоже, это работает так, как вам хотелось бы (Visual Studio 2013, шаблон проекта ASP.NET).
bzlm
Похоже, они удалили предварительно созданное поведение, упомянутое в комментарии выше, в Visual Studio 2015 и более поздних версиях.
justdan23

Ответы:

92

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

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


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

Исключение файлов

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

Сайед Ибрагим Хашими
источник
8
@Sayed, похоже, это не работает для VS2012, вы знаете, как это можно обновить для этого сценария. переход на v11.0 не работает. TIA.
Саймон Франческо,
2
По этому поводу буквально нигде нет документации. В документации Microsoft есть ссылки на ваши блоги.
Мэтью Джеймс Дэвис
2
@Daniel Если вам нужны только определенные файлы, а не папка, просто измените _CustomFiles, чтобы включить эти конкретные файлы вместо рекурсивного добавления с ***. Итак, что-то вроде <_CustomFiles Include = ".. \ Dependencies \ FileA.dll" /> <_ CustomFiles Include = "C: \ Someotherplace \ FileB.txt" /> Что-то похожее на это.
bwerks 04
3
@SimonFrancesco Я тоже испытал это, и необходимое изменение, похоже, заключалось в расширении <CopyAllFilesToSingleFolderForMsdeployDependsOn>, а не <CopyAllFilesToSingleFolderForPackageDependsOn>, как написано в ответе выше.
bwerks 04
13

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

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

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

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

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

Brodie
источник
6

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

Gomes
источник
1
Верно, но дополнительно вы должны выбрать «Копировать, если новее» или «Копировать всегда», потому что в противном случае действие по умолчанию - «Не копировать», даже если выбрано «Содержимое».
Мэтт
1
согласен с Мэттом для дополнительного шага
Гомес
7
Для папок нет действия по сборке (VS2013)
Кристиан Э.
copytooutputdirectory = Всегда копировать
Gomes
Работает даже без Copy Always.
Тенгиз
3

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

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

Пример:

введите описание изображения здесь

пользователь2695433
источник
Хотя это небольшой дополнительный шаг, он очень прост.
Киаран Галлахер
0

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

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

Это было с помощью Visual Studio 2015 Professional

Джеймс Вежба
источник
0

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

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

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

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

Джон Глисон
источник