Як опублікувати веб за допомогою msbuild?


217

Visual Studio 2010 має команду Publish, яка дозволяє публікувати проект веб-застосунку у розташуванні файлової системи. Я хотів би зробити це на моєму сервері збірки TeamCity, тому мені потрібно це зробити за допомогою програми для запуску рішень або msbuild. Я спробував використати ціль Publish, але я думаю, що це може бути для ClickOnce:

msbuild Project.csproj /t:Publish /p:Configuration=Deploy

Я в основному хочу робити саме те, що робить проект веб-розгортання, але без надбудови. Мені він потрібен, щоб скомпілювати WAP, видалити всі непотрібні для виконання файли, виконати будь-які перетворення web.config та скопіювати вихідні дані у вказане місце.

Моє рішення , засноване на відповіді Джеффа Сівера

<Target Name="Deploy">
    <MSBuild Projects="$(SolutionFile)" 
             Properties="Configuration=$(Configuration);DeployOnBuild=true;DeployTarget=Package" 
             ContinueOnError="false" />
    <Exec Command="&quot;$(ProjectPath)\obj\$(Configuration)\Package\$(ProjectName).deploy.cmd&quot; /y /m:$(DeployServer) -enableRule:DoNotDeleteRule" 
          ContinueOnError="false" />
</Target>


@SnOrfus Зараз я використовую проекти розгортання веб-сайтів у VS 2008 (як я вже згадував у своїй відповіді на це запитання), але я хотів би спробувати автоматизувати функцію публікації VS 2010.
jrummell

Це питання виглядає корисний stackoverflow.com/questions/1983575 / ...
jrummell

2
Лише одна невеличка поправка до вашого сценарію: ви використовуєте $ (ProjectPath) для сценарію розгортання, але ви дійсно хочете, це $ (ProjectDir), інакше ви отримаєте .csproj \ obj
Полювання на Трою

2
Починаючи з VS2012, це набагато простіше: stackoverflow.com/a/13947667/270348
RobSiklos

Відповіді:


136

Я здебільшого працював без власного скрипта msbuild. Ось відповідні налаштування конфігурації збірки TeamCity:

Шляхи артефактів:% system.teamcity.build.workingDir% \ MyProject \ obj \ Debug \ Package \ PackageTmp 
Тип бігуна: MSBuild (Бігун для файлів MSBuild) 
Шлях до файлу збірки: MyProject \ MyProject.csproj 
Робочий каталог: те саме, що і каталог замовлення 
Версія MSBuild: Microsoft .NET Framework 4.0 
MSBuild Tools Версія: 4.0 
Запустити платформу: x86 
Цілі: Пакет 
Параметри командного рядка для MSBuild.exe: / p: Конфігурація = Налагодження

Це скомпілює, упакує (із перетворенням web.config) та збереже вихідні дані як артефакти. Єдине, чого не вистачає - це копіювання вихідних даних у вказане місце, але це можна зробити або в іншій конфігурації збірки TeamCity із залежністю артефакту, або за допомогою скрипта msbuild.

Оновлення

Ось скрипт msbuild, який буде компілювати, упаковувати (із перетворенням web.config) та копіювати вихідні дані на мій проміжний сервер

<?xml version="1.0" encoding="utf-8" ?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
        <SolutionName>MySolution</SolutionName>
        <SolutionFile>$(SolutionName).sln</SolutionFile>
        <ProjectName>MyProject</ProjectName>
        <ProjectFile>$(ProjectName)\$(ProjectName).csproj</ProjectFile>
    </PropertyGroup>

    <Target Name="Build" DependsOnTargets="BuildPackage;CopyOutput" />

    <Target Name="BuildPackage">
        <MSBuild Projects="$(SolutionFile)" ContinueOnError="false" Targets="Rebuild" Properties="Configuration=$(Configuration)" />
        <MSBuild Projects="$(ProjectFile)" ContinueOnError="false" Targets="Package" Properties="Configuration=$(Configuration)" />
    </Target>

    <Target Name="CopyOutput">
        <ItemGroup>
            <PackagedFiles Include="$(ProjectName)\obj\$(Configuration)\Package\PackageTmp\**\*.*"/>
        </ItemGroup>
        <Copy SourceFiles="@(PackagedFiles)" DestinationFiles="@(PackagedFiles->'\\build02\wwwroot\$(ProjectName)\$(Configuration)\%(RecursiveDir)%(Filename)%(Extension)')"/>
    </Target>
</Project>

Ви також можете видалити властивості SolutionName та ProjectName з тегу PropertyGroup і передати їх msbuild.

msbuild build.xml /p:Configuration=Deploy;SolutionName=MySolution;ProjectName=MyProject

Оновлення 2

Оскільки це питання все ще отримує значну кількість трафіку, я вважав, що варто оновити свою відповідь своїм поточним сценарієм, що використовує Web Deploy (також відомий як MSDeploy).

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build" ToolsVersion="4.0">
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
    <ProjectFile Condition=" '$(ProjectFile)' == '' ">$(ProjectName)\$(ProjectName).csproj</ProjectFile>
    <DeployServiceUrl Condition=" '$(DeployServiceUrl)' == '' ">http://staging-server/MSDeployAgentService</DeployServiceUrl>
  </PropertyGroup>

  <Target Name="VerifyProperties">
    <!-- Verify that we have values for all required properties -->
    <Error Condition=" '$(ProjectName)' == '' " Text="ProjectName is required." />
  </Target>

  <Target Name="Build" DependsOnTargets="VerifyProperties">
    <!-- Deploy using windows authentication -->
    <MSBuild Projects="$(ProjectFile)"
             Properties="Configuration=$(Configuration);
                             MvcBuildViews=False;
                             DeployOnBuild=true;
                             DeployTarget=MSDeployPublish;
                             CreatePackageOnPublish=True;
                             AllowUntrustedCertificate=True;
                             MSDeployPublishMethod=RemoteAgent;
                             MsDeployServiceUrl=$(DeployServiceUrl);
                             SkipExtraFilesOnServer=True;
                             UserName=;
                             Password=;"
             ContinueOnError="false" />
  </Target>
</Project>

У TeamCity, у мене є параметри , названі env.Configuration, env.ProjectNameі env.DeployServiceUrl. Бігун MSBuild має шлях до файлу збірки, і параметри передаються автоматично (вам не потрібно вказувати їх у параметрах командного рядка).

Ви також можете запустити його з командного рядка:

msbuild build.xml /p:Configuration=Staging;ProjectName=MyProject;DeployServiceUrl=http://staging-server/MSDeployAgentService

2
дякую - це також добре працює безпосередньо з PowerShell (вибачення за форматування - каретка не повертається в коментарях): & msbuild "$ solution" / p: "Configuration = $ configuration"; & msbuild "$ project" / t: Package / p: "Configuration = $ configuration; _PackageTempDir = $ outputfolder"
zcrar70

Я спробував приклад із вашого першого оновлення, і, схоже, Packageціль також залежить від WebDeploy: error : Package/Publish task Microsoft.Web.Publishing.Tasks.IsCleanMSDeployPackageNeeded failed to load Web Deploy assemblies. Microsoft Web Deploy is not correctly installed on this machine.(згадуючи це, оскільки ви пишете, що ваше друге оновлення використовує WebDeploy, що може означати, що перше ще не використовує WebDeploy.)
chiccodoro

@jrummell: Я хочу розгорнути свій веб-проект Visual Studio на віддаленому сервері Windows від TeamCity. Що я повинен зробити. Я новачок і не уявляю, що робити
Невін Радж Віктор

1
Я можу змусити це працювати на TeamCity з проектами веб-додатків, але я також маю застарілий веб-сайт PROJECT, який мені також потрібно опублікувати (як пакет), а потім використовувати MSDeploy. Якщо я публікую в VS2013, я отримую пакет розгортання, але MSBuild з рядка cmd не створює його. Будь-які думки?
KnowHowSolutions

1
Я не бачу в цьому жодної згадки про профіль публікації. Слід вказати профіль публікації, щоб застосувати правильне перетворення web.config. Оновлення: Неважливо ... ця функція була введена через 2 роки після цієї публікації. Цей все ще, мабуть, працює. Пізніше допис у цій темі показує, як публікувати за допомогою профілю публікації з командного рядка.
Трійко

84

Використовуючи профілі розгортання, представлені у VS 2012, ви можете публікувати за допомогою такого командного рядка:

msbuild MyProject.csproj /p:DeployOnBuild=true /p:PublishProfile=<profile-name> /p:Password=<insert-password> /p:VisualStudioVersion=11.0

Для отримання додаткової інформації про параметри дивіться це .

Значення /p:VisualStudioVersionпараметра залежать від вашої версії Visual Studio. У Вікіпедії є таблиця випусків Visual Studio та їх версії .


6
Використовуючи VS2012 .NET 3.5, це не спрацювало для розгортання у файловій системі. Він просто створює і не розгортає.
Джей Салліван,

2
ваш /p:VisualStudioVersion=11.0 врятував мені життя. Я використовую /p:VisualStudioVersion=12.0 для vs2013 і працює нормально.
Seyed Morteza Mousavi

Яким буде значення /p:VisualStudioVersion=?для VS 2017?
Нішант

створив скрипт збірки msbuild test.sln /p:DeployOnBuild=True /p:DeployDefaultTarget=WebPublish /p:WebPublishMethod=FileSystem /p:DeleteExistingFiles=True /p:publishUrl=.\build_output1\pub /p:PublishProfile=FolderProfile /p:VisualStudioVersion=11.0 /p:outdir=.\build_output1 ...... Але все одно отримую лише DLL, а не всі файли, як у папці публікації: (`
Nishant

@Nishant Для VS 2017, використовуйте /p:VisualStudioVersion=15. Я не впевнений, що це пов’язано з вашою проблемою копіювання файлів.
Кріс

39

Я придумав таке рішення, яке для мене чудово працює:

msbuild /t:ResolveReferences;_WPPCopyWebApplication /p:BuildingProject=true;OutDir=C:\Temp\build\ Test.csproj

Секретний соус - ціль _WPPCopyWebApplication.


1
Що таке _WPPCopyWebApplication і як я можу ним користуватися MSBbuild xml файл конфігурації /
Johnny_D

4
Використовуючи VS2012 .NET 3.5, я отримав помилку error MSB4057: The target "_WPPCopyWebApplication" does not exist in the project. Видалення цієї частини призвело до розгортання без розгортання будь-яких поглядів
Джей Салліван

Можливо, вам доведеться викликати його з іншим /p:VisualStudioVersion=12.0, оскільки build використовує цілі з c: \ program files (x86) \ msbuild \ microsoft \ visualstudio \ VERSION \ Webapplication \ Microsoft.WebApplication.targets, тож, можливо, його використання старіша версія, яка не має правильної цілі.
Джим Вольф,

@FRoZeN Я намагався використовувати MSBuild як MSBuild.exe C:\BuildAgent\work\4c7b8ac8bc7d723e\WebService.sln /p:Configuration=Release /p:OutputPath=bin /p:DeployOnBuild=True /p:DeployTarget=MSDeployPublish /p:MsDeployServiceUrl=https://204.158.674.5/msdeploy.axd /p:username=Admin /p:password=Password#321 /p:AllowUntrustedCertificate=True /p:DeployIisAppPath=Default WebSite/New /p:MSDeployPublishMethod=WMSVC. Це видає мені помилку MSBUILD : error MSB1008: Only one project can be specified. Switch: WebSite/New. Чи є для цього рішення?
Невін Радж Віктор

1
@NevinRajVictor ця помилка, ймовірно, тому, що у вас є пробіл у значенні DeployIisAppPath. Вам потрібно буде помістити значення в лапки. напр. / p: DeployIisAppPath = "Веб-сайт за замовчуванням / Новий"
shiitake

28

Я не знаю TeamCity, тому сподіваюся, це може допомогти вам.

Найкращий спосіб, який я знайшов, це зробити за допомогою MSDeploy.exe. Це частина проекту WebDeploy, керованого корпорацією Майкрософт. Ви можете завантажити біти тут .

За допомогою WebDeploy ви запускаєте командний рядок

msdeploy.exe -verb:sync -source:contentPath=c:\webApp -dest:contentPath=c:\DeployedWebApp

Це робить те саме, що команда VS Publish, копіюючи лише необхідні біти в папку розгортання.


Це виглядає багатообіцяючим. Однак схоже, що служба управління доступна лише на сервері 2008. На моєму проміжному сервері (де я хочу автоматизувати розгортання) працює Windows 7 Pro.
jrummell

2
У продукті є дві штуки. Для компонентів, які інтегруються прямо в IIS, потрібен сервер 2008. Компонент командного рядка не має цієї вимоги; У мене це працює на сервері Server 2003, який я використовую для розгортання.
Джефф Сівер,

Я читав на MSDeploy. Я встановив його та працюю на моєму проміжному сервері, дякую! Чи можу я запустити MSDeploy зі сценарію MSBuild?
jrummell

1
робить те саме, що і яка конфігурація команди VS Publish? Який метод публікації - файлова система чи інший? Чи використовує файл MyProject.Publish.xml для визначення файлів, які потрібно скопіювати?
Ентоні

1
Я просто зробив спробу, але це не так само, як VS Publish. Він робив те саме, що і XCopy, включаючи всі вихідні файли.
Луї Сомерс

13

З VisualStudio 2012 існує спосіб обробляти subj без публікації профілів. Ви можете передати вихідну папку за допомогою параметрів. Він працює як з абсолютним, так і з відносним шляхом у параметрі'pubUrl '. Ви можете використовувати VS100COMNTOOLS, однак вам потрібно замінити VisualStudioVersion, щоб використовувати цільову "WebPublish" з %ProgramFiles%\MSBuild\Microsoft\VisualStudio\v11.0\WebApplications\Microsoft.WebApplication.targets. З VisualStudioVersion 10.0 цей сценарій буде успішним без вихідних даних :)

Оновлення: Мені вдалося використати цей метод на сервері збірки, на якому встановлено лише Windows SDK 7.1 (без Visual Studio 2010 та 2012 на машині). Але мені довелося виконати ці кроки, щоб це вдалося:

  1. Оновіть Windows SDK 7.1 на машині за допомогою відповіді Simmo ( https://stackoverflow.com/a/2907056/2164198 )
  2. Встановлення ключа реєстру HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ VisualStudio \ SxS \ VS7 \ 10.0 у "C: \ Program Files \ Microsoft Visual Studio 10.0 \" (використовуйте свій шлях відповідно)
  3. Копіювання папки% ProgramFiles% \ MSBuild \ Microsoft \ VisualStudio \ v11.0 з моєї машини розробника для створення сервера

Сценарій:

set WORK_DIR=%~dp0
pushd %WORK_DIR%
set OUTPUTS=%WORK_DIR%..\Outputs
set CONFIG=%~1
if "%CONFIG%"=="" set CONFIG=Release
set VSTOOLS="%VS100COMNTOOLS%"
if %VSTOOLS%=="" set "PATH=%PATH%;%WINDIR%\Microsoft.NET\Framework\v4.0.30319" && goto skipvsinit
call "%VSTOOLS:~1,-1%vsvars32.bat"
if errorlevel 1 goto end
:skipvsinit
msbuild.exe Project.csproj /t:WebPublish /p:Configuration=%CONFIG% /p:VisualStudioVersion=11.0 /p:WebPublishMethod=FileSystem /p:publishUrl=%OUTPUTS%\Project
if errorlevel 1 goto end
:end
popd
exit /b %ERRORLEVEL%

Дякую за це рішення - це те, що я шукав: опція WebPublish із розгортанням файлової системи.
woohoo

12

знайшов два різні рішення, які працювали дещо по-іншому:

1. Це рішення натхнене відповіддю від alexanderb [посилання] . На жаль, у нас це не спрацювало - деякі DLL-файли не були скопійовані в OutDir. Ми з'ясували , що заміна ResolveReferencesз Buildметою вирішити цю проблему - тепер всі необхідні файли копіюються в розташування OUTDIR.

msbuild / target: Build; _WPPCopyWebApplication / p: Configuration = Release; OutDir = C: \ Tmp \ myApp \ MyApp.csproj
Недоліком цього рішення був той факт, що OutDir містив не лише файли для публікації.

2. Перше рішення працює добре, але не так, як ми очікували. Ми хотіли мати функцію публікації, як це є в Visual Studio IDE - тобто лише файли, які слід опублікувати, будуть скопійовані в каталог виводу. Як уже зазначалося, перше рішення копіює набагато більше файлів у OutDir - веб-сайт для публікації потім зберігається в_PublishedWebsites/{ProjectName} підпапці. Наступна команда вирішує це - лише файли для публікації будуть скопійовані у потрібну папку. Отже, у вас є каталог, який можна публікувати безпосередньо - у порівнянні з першим рішенням ви заощадите трохи місця на жорсткому диску.

msbuild / target: Build; PipelinePreDeployCopyAllFilesToOneFolder / p: Configuration = Release; _PackageTempDir = C: \ Tmp \ myApp \; AutoParameterizationWebConfigConnectionStrings = false MyApp.csproj
AutoParameterizationWebConfigConnectionStrings=falseПараметр гарантує, що рядки з'єднання не будуть оброблятися як спеціальні артефакти і будуть правильно сформовані - для отримання додаткової інформації див. посилання .


Ваш варіант №2 допоміг мені без проблем позбутися застарілої програми _CopyWebApplication. Ви врятували мій Build-Server після оновлення до VS 2015. Чудове дослідження. Вдячний.
it3xl

Ваш варіант №2 ідеально підходить для мого сценарію збірки.
AnthonyVO

3

Ви повинні встановити своє середовище

  • <Назва веб-сайту>
  • <домен>

та посилання на мій блог. (вибачте, що корейська)

  • http://xyz37.blog.me/50124665657
  • http://blog.naver.com/PostSearchList.nhn?SearchText=webdeploy&blogId=xyz37&x=25&y=7

    @ECHO OFF
    :: http://stackoverflow.com/questions/5598668/valid-parameters-for-msdeploy-via-msbuild
    ::-DeployOnBuild -True
    :: -False
    :: 
    ::-DeployTarget -MsDeployPublish
    :: -Package
    :: 
    ::-Configuration -Name of a valid solution configuration
    :: 
    ::-CreatePackageOnPublish -True
    :: -False
    :: 
    ::-DeployIisAppPath -<Web Site Name>/<Folder>
    :: 
    ::-MsDeployServiceUrl -Location of MSDeploy installation you want to use
    :: 
    ::-MsDeployPublishMethod -WMSVC (Web Management Service)
    :: -RemoteAgent
    :: 
    ::-AllowUntrustedCertificate (used with self-signed SSL certificates) -True
    :: -False
    :: 
    ::-UserName
    ::-Password
    SETLOCAL
    
    IF EXIST "%SystemRoot%\Microsoft.NET\Framework\v2.0.50727" SET FXPath="%SystemRoot%\Microsoft.NET\Framework\v2.0.50727"
    IF EXIST "%SystemRoot%\Microsoft.NET\Framework\v3.5" SET FXPath="%SystemRoot%\Microsoft.NET\Framework\v3.5"
    IF EXIST "%SystemRoot%\Microsoft.NET\Framework\v4.0.30319" SET FXPath="%SystemRoot%\Microsoft.NET\Framework\v4.0.30319"
    
    SET targetFile=<web site fullPath ie. .\trunk\WebServer\WebServer.csproj
    SET configuration=Release
    SET msDeployServiceUrl=https://<domain>:8172/MsDeploy.axd
    SET msDeploySite="<WebSite name>"
    SET userName="WebDeploy"
    SET password=%USERNAME%
    SET platform=AnyCPU
    SET msbuild=%FXPath%\MSBuild.exe /MaxCpuCount:%NUMBER_OF_PROCESSORS% /clp:ShowCommandLine
    
    %MSBuild% %targetFile% /p:configuration=%configuration%;Platform=%platform% /p:DeployOnBuild=True /p:DeployTarget=MsDeployPublish /p:CreatePackageOnPublish=False /p:DeployIISAppPath=%msDeploySite% /p:MSDeployPublishMethod=WMSVC /p:MsDeployServiceUrl=%msDeployServiceUrl% /p:AllowUntrustedCertificate=True /p:UserName=%USERNAME% /p:Password=%password% /p:SkipExtraFilesOnServer=True /p:VisualStudioVersion=12.0
    
    IF NOT "%ERRORLEVEL%"=="0" PAUSE 
    ENDLOCAL
    

1

Це мій пакетний файл

C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe C:\Projects\testPublish\testPublish.csproj  /p:DeployOnBuild=true /property:Configuration=Release
if exist "C:\PublishDirectory" rd /q /s "C:\PublishDirectory"
C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe -v / -p C:\Projects\testPublish\obj\Release\Package\PackageTmp -c C:\PublishDirectory
cd C:\PublishDirectory\bin 
del *.xml
del *.pdb

5
Було б чудово, якби ви могли детально розказати свою відповідь. Як саме ваш командний файл вирішує проблему OP? Дякую!
Луїс Круз,

1

це моя робоча партія

публікація-мій-веб-сайт.бат

SET MSBUILD_PATH="C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin"
SET PUBLISH_DIRECTORY="C:\MyWebsitePublished"
SET PROJECT="D:\Github\MyWebSite.csproj"


cd /d %MSBUILD_PATH%
MSBuild %PROJECT%  /p:DeployOnBuild=True /p:DeployDefaultTarget=WebPublish /p:WebPublishMethod=FileSystem /p:DeleteExistingFiles=True /p:publishUrl=%PUBLISH_DIRECTORY%

Зверніть увагу, що я встановив Visual Studio на сервері, щоб мати можливість працювати, MsBuild.exeоскільки MsBuild.exeпапки в .Net Framework не працюють.


msbuild test.sln /p:DeployOnBuild=True /p:DeployDefaultTarget=WebPublish /p:WebPublishMethod=FileSystem /p:DeleteExistingFiles=True /p:publishUrl=.\build_output1\pub /p:PublishProfile=FolderProfile /p:VisualStudioVersion=11.0 /p:outdir=.\build_output1 ...... Але все одно отримую лише бібліотеки DLL, а не потрібну структуру файлів. Що не так з ним? :(
Нішант

1

Ви можете опублікувати рішення з потрібним шляхом за кодом нижче, тут PublishInDFolder - це ім'я, яке має шлях, де нам потрібно опублікувати (нам потрібно створити це на малюнку нижче)

Ви можете створити такий файл публікації

Додайте нижче 2 рядки коду в командний файл (.bat)

@echo OFF 
call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\Tools\VsMSBuildCmd.bat"
MSBuild.exe  D:\\Solution\\DataLink.sln /p:DeployOnBuild=true /p:PublishProfile=PublishInDFolder
pause

0

Для генерації вихідних даних публікації надайте ще один параметр. msbuild example.sln / p: publiciprofile = ім'я профілю / p: deployonbuild = true / p: configuration = debug / або будь-який

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.