Как добраться, Visual Studio 'Публикуют' функциональность для включения файлов от события сборки сообщения?

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

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

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

87
задан brodie 29 June 2010 в 04:34
поделиться

2 ответа

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

89
ответ дан 24 November 2019 в 07:51
поделиться

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

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

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

      * .cs; ** \. Svn \ ** \ *. *; Интернет. *. Config; *. Csproj * 
    .svn; Контроллеры; Задачи начальной загрузки; Свойства 
    
  6. Сохраните и перезагрузите ваш проект.

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

13
ответ дан 24 November 2019 в 07:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: