В настоящее время я пытаюсь использовать функциональные возможности Visual Studio 2010 «Опубликовать» и MSDeploy для удовлетворения своих потребностей в веб-развертывании, но столкнулся с препятствием в отношении настройки пакета в зависимости от моей конфигурации сборки.
Я разрабатываю в 32-битной среде, но мне нужно создать пакет выпуска для 64-битной среды, поэтому в конфигурации Release у меня есть событие post build, которое копирует 64-битную версию сторонней dll в каталог bin, перезаписывая 32-битную версию . Когда я использую функцию «Опубликовать», даже если в каталог bin копируется правильная 64-битная dll, она не включается в пакет.
Есть ли способ заставить «Опубликовать» включить файлы, которые были скопированы в каталог bin во время пост-сборки?
Ответы:
Я ответил на аналогичный, но другой вопрос в разделе Как включить дополнительные файлы с помощью пакетов веб-развертывания 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. Я не буду здесь вдаваться в подробности, но вы должны знать, что нужно всегда это указывать.
источник
Я нашел способ решения проблемы, используя
ExcludeFilesFromDeployment
элемент в файле проекта. Я получил идею из веб-развертывания: исключение файлов и папокПоэтому, если вам нужно упаковать файлы проекта в том виде, в каком они существуют в каталоге вашего проекта после успешной сборки и связанных шагов пост-сборки, выполните следующие действия.
выберите «Элементы для развертывания» на «Все файлы в этой папке проекта».
PropertyGroup
элемент, связанный с настройкой конфигурации, например «Release».Внутри
PropertyGroup
элемента добавьте следующие элементы и исключите файлы и папки, которые вам не нужны в пакете.<ExcludeFilesFromDeployment>*.cs;**\.svn\**\*.*;Web.*.config;*.csproj*</ExcludeFilesFromDeployment> <ExcludeFoldersFromDeployment>.svn;Controllers;BootstrapperTasks;Properties</ExcludeFoldersFromDeployment>
Сохраните и перезагрузите ваш проект
На данный момент это решает мою проблему, но если есть лучшее решение, дайте мне знать, так как это не идеально из-за задействованного взлома, но опять же, возможно, это необычный сценарий развертывания?
источник
Выберите файлы или папки и измените действие сборки как содержимое в окне свойств.
источник
Я знаю, что это старый вопрос, но ни один из них не помог мне.
В 2017 VS я просто щелкнул правой кнопкой мыши дополнительную папку, которую нужно опубликовать, и выбрал опубликовать, это сработало.
Пример:
источник
Добавление папки bin (и ее содержимого) в проект привело к тому, что файлы были скопированы в выходной каталог публикации.
Для меня проблема заключалась в том, что мне нужно было поместить файл лицензии на проприетарное программное обеспечение в папку bin /, но я не хотел копировать его вручную при каждом развертывании.
Это было с помощью Visual Studio 2015 Professional
источник
Я знаю, что это старый разговор, но я наткнулся на него, пытаясь сделать то же самое, и подумал, что было бы полезно добавить то, что я нашел здесь.
Почти все статьи о добавлении дополнительных файлов в вашу публикацию используют этот метод добавления элементов
CopyAllFilesToSingleFolderForPackageDependsOn
илиCopyAllFilesToSingleFolderForMSDeployDependsOn
в,PropertyGroup
и все они похожи на что-то вроде «Я добавил это в конец файла ...»Это то, что я сделал, и провел день, пытаясь понять, почему ничего не происходит, пока не понял, что
PropertyGroup
в верхней части файла уже есть раздел. Когда я поместил свойCopyAllFilesToSingleFolderForPackageDependsOn
в этот раздел, он работал нормально.Надеюсь, это когда-нибудь сэкономит кому-то время
источник