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



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



Я пытаюсь опубликовать только необходимые файлы с этого сайта в целевом месте (C:buildsMyProject[Файлы])



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



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



C:WindowsMicrosoft.NETFrameworkv4.0.30319MSBuild.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:buildsMyProject</publishUrl>
<DeleteExistingFiles>True</DeleteExistingFiles>
</PropertyGroup>
</Project>


результирующее поведение-это:




  • здесь создается zip-файл:./ProjectRoot / obj/Debug/Package / MyProject.молнии

  • ничего развертывается в <publishUrl>C:buildsMyProject</publishUrl> WTF

  • zip-файл, который создается, является свиньи завтрак и полон файлов, которые не нужны для приложения.


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



Как я могу получить этот простой результат от MSBuild?

853   5  

5 ответов:

FYI: у меня была такая же проблема с 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, не уверен, что это было необходимо. Но я определенно должен был удалить часть условия.)

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

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

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

во всяком случае, после копания в Microsoft.Сеть.Издательский.цели файл в течение нескольких часов и стучать головой о стену проб и ошибок, Мне удалось выяснить, как Visual Studio, похоже, выполняет свои функции magic one click "опубликовать в файловой системе" и " построить развертывание Пакет " особенности. Я буду получать в немного MSBuild сценариев, так что если вы не знакомы с MSBuild я предлагаю вам проверить этот крах страницы MSDN, конечно.

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

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

это означает, что делать это через MSBuild в командной строке не так просто, как вызов файла проекта с определенной целью и установка некоторых свойств. Вам нужно будет сделать то, что VS2010 должен иметь готово: создайте цель самостоятельно, которая выполняет половину развертывания, а затем копирует результаты в целевую папку. Редактирование файла проекта, право нажмите на проект в VS2010 и нажмите кнопку выгрузить проект, затем щелкните правой кнопкой мыши и выберите Изменить. Прокрутите вниз, пока не найдете Элемент импорта, импортирующий целевые объекты веб-приложения (Microsoft.Значение webapplication.цели; этот файл сам импортирует Microsoft.Сеть.Издательский.целевой файл, упомянутый ранее). Нижний в этой строке мы добавим нашу новую цель, называемую 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.Сеть.Издательский.цели показывает, что вызов этой цели вызывает файлы проекта, которые будут помещены в каталог, указанный _PackageTempDir собственность.

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

затем мы определяем элемент с именем PublishFiles, который представляет все файлы, найденные в папке _PackageTempDir. Затем выполняется задача копирования вызывается, который копирует все эти файлы в папку назначения публикации. В Списке Destinationfiles атрибут элемента Copy является немного сложным; он выполняет преобразование элементов и преобразует их пути к новым пути, укорененные в папке PublishDestination (проверьте хорошо известный Метаданные элемента, чтобы увидеть, что означают эти %() s.

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

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

все еще были проблемы после попытки все ответы выше (я использую 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.

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

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

пример:

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

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

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

 /p:VisualStudioVersion=12.0

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

Comments

    Ничего не найдено.