Подтвердить что ты не робот

Как публиковать Web с помощью msbuild?

В Visual Studio 2010 есть команда публикации, которая позволяет публиковать проект веб-приложения в месте расположения файловой системы. Я хотел бы сделать это на моем сервере сборки TeamCity, поэтому мне нужно сделать это с помощью runner или msbuild. Я попытался использовать цель публикации, но я думаю, что это может быть для 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>
4b9b3361

Ответ 1

Я работал в основном без пользовательского msbuild script. Вот соответствующие настройки конфигурации сборки TeamCity:

Artifact paths: %system.teamcity.build.workingDir%\MyProject\obj\Debug\Package\PackageTmp 
Type of runner: MSBuild (Runner for MSBuild files) 
Build file path: MyProject\MyProject.csproj 
Working directory: same as checkout directory 
MSBuild version: Microsoft .NET Framework 4.0 
MSBuild ToolsVersion: 4.0 
Run platform: x86 
Targets: Package 
Command line parameters to MSBuild.exe: /p:Configuration=Debug

Это будет скомпилировать, пакет (с преобразованием web.config) и сохранить результат как артефакты. Единственное, чего не хватает, это копирование вывода в указанное место, но это можно сделать либо в другой конфигурации сборки TeamCity с зависимостью артефакта, либо с помощью msbuild script.

Обновление

Вот msbuild script, который будет компилировать, упаковать (с преобразованием 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

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

Используя профили развертывания, представленные в VS 2012, вы можете опубликовать их со следующей командной строкой:

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

Для получения дополнительной информации о параметрах см. это.

Ответ 3

Я придумал такое решение, отлично работает для меня:

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

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

Ответ 4

Я не знаю TeamCity, поэтому надеюсь, что это может сработать для вас.

Лучший способ, которым я нашел это, - это MSDeploy.exe. Это часть проекта WebDeploy, выполняемого Microsoft. Вы можете скачать бит здесь.

С помощью WebDeploy вы запустите командную строку

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

Это делает то же самое, что и команда VS Publish, копируя только необходимые биты в папку развертывания.

Ответ 5

С VisualStudio 2012 существует способ обработки subj без публичных профилей. Вы можете передать выходную папку с помощью параметров. Он работает как с абсолютным, так и с относительным путем в параметре "publishUrl". Вы можете использовать VS100COMNTOOLS, однако вам нужно переопределить VisualStudioVersion для использования целевого "WebPublish" с %ProgramFiles%\MSBuild\Microsoft\VisualStudio\v11.0\WebApplications\Microsoft.WebApplication.targets. С VisualStudioVersion 10.0 этот script будет работать без выходов:)

Обновление: Мне удалось использовать этот метод на сервере сборки с установленным только Windows SDK 7.1 (без Visual Studio 2010 и 2012 на машине). Но я должен был выполнить следующие шаги, чтобы заставить его работать:

  • Сделать Windows SDK 7.1 текущим на машине с помощью ответа Simmo (fooobar.com/questions/34295/...)
  • Настройка ключа реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\SxS\VS7\10.0 на "C:\Program Files\Microsoft Visual Studio 10.0 \" (используйте свой путь по мере необходимости)
  • Копирование папки% ProgramFiles%\MSBuild\Microsoft\VisualStudio\v11.0 с моей машины разработчика для сборки сервера

Script:

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%

Ответ 6

нашли два разных решения, которые работали несколько иначе:

1. Это решение вдохновлено ответом от alexanderb [link]. К сожалению, это не сработало для нас - некоторые dll не были скопированы в OutDir. Мы выяснили, что замена ResolveReferences на Build target решает проблему - теперь все необходимые файлы копируются в местоположение 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 гарантирует, что строки подключения не будут обрабатываться как специальные артефакты и будут правильно сгенерированы - для получения дополнительной информации см. ссылку .

Ответ 7

Вы должны настроить среду

  • < Имя веб-сайтa >
  • < домен >

и ссылку на мой блог. (извините, был корейский)

  • 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
    

Ответ 8

Этот мой командный файл

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