it-swarm.com.ru

Использование msbuild для выполнения профиля публикации файловой системы

У меня есть проект c # .Net 4.0, созданный с VS2010 и теперь доступ с VS2012.

Я пытаюсь опубликовать только нужные файлы с этого сайта в место назначения (C:\builds\MyProject [Files])

Моя файловая структура: ./ProjectRoot/MyProject.csproj ./ProjectRoot/Свойства/PublishProfiles/FileSystemDebug.pubxml

Я запускаю следующее через MSBuild:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe ./ProjectRoot/MyProject.csproj/p: DeployOnBuild = true /p:PublishProfile=./ProjectRoot/Properties/PublishProfiles/FileSystemDebug.pubxml

Вот XML в FileSystemDebug.pubxml

<Project ToolsVersion="4.0" xmlns="http://schemas.Microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <WebPublishMethod>FileSystem</WebPublishMethod>
    <LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
    <LastUsedPlatform>Any CPU</LastUsedPlatform>
    <SiteUrlToLaunchAfterPublish />
    <ExcludeApp_Data>False</ExcludeApp_Data>
    <publishUrl>C:\builds\MyProject\</publishUrl>
    <DeleteExistingFiles>True</DeleteExistingFiles>
  </PropertyGroup>
</Project>

В результате получается следующее поведение:

  • zip-файл создается здесь: ./ProjectRoot/obj/Debug/Package/MyProject.Zip
  • Ничего не развернуто в<publishUrl>C:\builds\MyProject\</publishUrl>WTF
  • созданный Zip-файл представляет собой «свиной завтрак» и полон файлов, которые не нужны для приложения.

Когда я запускаю этот профиль публикации через visual studio, создается папка в * C:\builds\MyProject *, в которой содержатся именно те артефакты, которые мне нужны.

Как мне получить этот простой результат из msbuild?

74
P. Roe

К вашему сведению: у меня была та же проблема с Visual Studio 2015. После многих часов попыток я теперь могу сделать msbuild myproject.csproj /p:DeployOnBuild=true /p:PublishProfile=myprofile.

Мне пришлось отредактировать мой файл .csproj, чтобы он заработал. Он содержал такую ​​строку:

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" 
  Condition="false" />

Я изменил эту строку следующим образом:

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v14.0\WebApplications\Microsoft.WebApplication.targets" />

(Я изменил 10.0 на 14.0, не уверен, было ли это необходимо. Но я определенно должен был удалить часть условия.)

38
johanv

Нашел ответ здесь: http://www.digitallycreated.net/Blog/59/locally-publishing-a-vs2010-asp.net-web-application-using-msbuild

В Visual Studio 2010 появилась новая публикация проектов веб-приложений функции, которые позволяют легко публиковать проект веб-приложения с помощью щелчок кнопки. За кулисами преобразование Web.config и сборка пакетов выполняется с помощью массивного скрипта MSBuild, который импортирован в файл проекта (находится по адресу: C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets) . К сожалению, сценарий очень сложный, грязный и недокументированный (за исключением некоторых часто плохо написанных и в основном бесполезных комментариев в файле). Большая блок-схема этого файла и немного документация о том, как подключиться к нему, была бы хорошей, но, похоже, к сожалению, не хватает (или, по крайней мере, я не могу его найти).

К сожалению, это означает выполнение публикации через командную строку гораздо непрозрачнее, чем должно быть. Я был удивлен отсутствием документации в этой области, потому что в эти дни многие магазины используют сервер непрерывной интеграции, а некоторые даже делают автоматическое развертывание (с которыми функции публикации VS2010 могли бы сильно помочь), поэтому я мог бы подумать, что включение этого (легко!) было бы довольно главное требование для функции.

Во всяком случае, после копания в Microsoft.Web.Publishing.targets на несколько часов и биться головой об стену проб и ошибок, Мне удалось выяснить, как Visual Studio выполняет свои Волшебный один клик «Опубликовать в файловую систему» ​​и «Построить развертывание Пакет ». Я немного разбираюсь в скриптах MSBuild, так что если вы не знакомы с MSBuild, я советую вам проверить это падение Конечно, MSDN страница.

Опубликовать в файловую систему

VS2010 Диалог публикации в файловую систему. Публикация в файловой системе заняла мне нужно немного потрудиться, потому что я ожидал разумного использования MSBuild быть происходящим. Вместо этого VS2010 делает что-то довольно странное: он вызывает на MSBuild выполнить своего рода половинное развертывание, которое готовит сеть файлы приложения в папке obj вашего проекта, то, кажется, делает руководство скопируйте эти файлы (т.е. за пределами MSBuild) в целевую публикацию папка. Это действительно странное поведение, потому что MSBuild разработан для копируйте файлы (и другие связанные со сборкой вещи), чтобы это имело смысл если весь процесс был только одной целью MSBuild, которую VS2010 вызвал на, а не цель, то ручная копия.

Это означает, что выполнение этого с помощью MSBuild в командной строке отличается от просто как вызов файла вашего проекта с определенной целью и установка некоторых свойств. Вам нужно будет сделать то, что должен иметь VS2010 готово: создайте цель самостоятельно, которая затем выполняет половинное развертывание копирует результаты в целевую папку. Чтобы отредактировать файл проекта, щелкните правой кнопкой мыши по проекту в VS2010 и выберите «Выгрузить проект», затем щелкните правой кнопкой мыши еще раз и нажмите Изменить. Прокрутите вниз, пока не найдете Элемент импорта, который импортирует цели веб-приложения (Microsoft.WebApplication.targets; сам этот файл импортирует упомянутый ранее файл Microsoft.Web.Publishing.targets). Под В этой строке мы добавим нашу новую цель под названием PublishToFileSystem:

<Target Name="PublishToFileSystem"
        DependsOnTargets="PipelinePreDeployCopyAllFilesToOneFolder">
    <Error Condition="'$(PublishDestination)'==''"
           Text="The PublishDestination property must be set to the intended publishing destination." />
    <MakeDir Condition="!Exists($(PublishDestination))"
             Directories="$(PublishDestination)" />

    <ItemGroup>
        <PublishFiles Include="$(_PackageTempDir)\**\*.*" />
    </ItemGroup>

    <Copy SourceFiles="@(PublishFiles)"
          DestinationFiles="@(PublishFiles->'$(PublishDestination)\%(RecursiveDir)%(Filename)%(Extension)')"
          SkipUnchangedFiles="True" />
</Target>

Эта цель зависит от Цель PipelinePreDeployCopyAllFilesToOneFolder - это то, что VS2010 вызывает, прежде чем он делает его ручное копирование. Некоторые копаются в Microsoft.Web.Publishing.targets показывает, что вызов этой цели вызывает файлы проекта для размещения в каталоге, указанном в свойство _PackageTempDir.

Первой задачей, которую мы вызываем в нашей цели, является задача Error, после которой мы поместили условие, гарантирующее, что задача будет выполнена, только если свойство PublishDestination не было установлено. Это поймает вас и ошибка сборки, если вы забыли указать Свойство PublishDestination. Затем мы вызываем задачу MakeDir для создания этот каталог PublishDestination, если он еще не существует.

Затем мы определяем элемент с именем PublishFiles, который представляет все файлы, найденные в папке _PackageTempDir. Задача копирования тогда вызываемый, который копирует все эти файлы в папку «Публикация назначения» . Атрибут DestinationFiles в элементе Copy немного сложен; он выполняет преобразование элементов и преобразует их пути в новые пути, укорененные в папке PublishDestination (ознакомьтесь с метаданными об известных элементах, чтобы узнать, что означают эти% ()).

Чтобы вызвать эту цель из командной строки, теперь мы можем просто выполнить эта команда (очевидно, изменяя имя файла проекта и свойства , чтобы удовлетворить вас):

msbuild Website.csproj "/p:Platform=AnyCPU;Configuration=Release;PublishDestination=F:\Temp\Publish" /t:PublishToFileSystem
39
P. Roe

Все еще были проблемы после того, как попробовали все ответы выше (я использую Visual Studio 2013). Ничего не было скопировано в папку публикации.

Подвох заключался в том, что если я запускаю MSBuild с отдельным проектом вместо решения, мне нужно добавить дополнительный параметр, который указывает версию Visual Studio:

/p:VisualStudioVersion=12.0

12.0 для VS2013, замените на версию, которую вы используете. Как только я добавил этот параметр, он просто работал.

Полная командная строка выглядит так:

MSBuild C:\PathToMyProject\MyProject.csproj /p:DeployOnBuild=true /p:PublishProfile=MyPublishProfile /p:VisualStudioVersion=12.0

Я нашел это здесь:

http://www.asp.net/mvc/overview/deployment/visual-studio-web-deployment/command-line-deployment

Они заявляют:

Если вы указываете отдельный проект вместо решения, вы должны добавить параметр, который указывает версию Visual Studio.

18
felix-b

Мне кажется, что ваш профиль публикации не используется, и выполняется некоторая упаковка по умолчанию. Цели Microsoft Web Publish делают все, что вы делаете выше, она выбирает правильные цели на основе конфигурации.

Я заставил мою работать без проблем с шага TeamCity MSBuild, но я определил явный путь к профилю, вы просто должны назвать его по имени без .pubxml (например, FileSystemDebug). Он будет найден так долго, как в стандартной папке, которая у вас есть.

Пример:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe ./ProjectRoot/MyProject.csproj /p:DeployOnBuild=true /p:PublishProfile=FileSystemDebug

Обратите внимание, что это было сделано с использованием версий цели Microsoft Web Publish для Visual Studio 2012, обычно расположенных по адресу «C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\Web». Проверьте папку развертывания для определенных целей типов развертывания, которые используются

11
GregS

К сведению: та же проблема с запуском на сервере сборки (Дженкинс с установленной MSbuild 15, запущенной из VS 2017 в веб-проекте .NET Core 2.1).

В моем случае это было использование цели публикации с msbuild, которая игнорировала профиль. 

Итак, моя команда msbuild началась с:

msbuild /t:restore;build;publish

Это правильно инициировало процесс публикации, но ни одна комбинация или вариант "/ p: PublishProfile = FolderProfile" никогда не работали для выбора профиля, который я хотел использовать ("FolderProfile").

Когда я перестал использовать цель публикации:

msbuild /t:restore;build /p:DeployOnBuild=true /p:PublishProfile=FolderProfile

Я (по глупости) думал, что это не будет иметь никакого значения, но как только я использовал переключатель DeployOnBuild, он правильно подобрал профиль.

1
From Orbonia

Сначала проверьте версию Visual Studio для ПК разработчика, которая может опубликовать решение (проект). как показано для VS 2013

 /p:VisualStudioVersion=12.0

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

0
shammakalubo