web-dev-qa-db-ja.com

msbuildでWebを公開する方法は?

Visual Studio 2010には、Webアプリケーションプロジェクトをファイルシステムの場所に発行できる[発行]コマンドがあります。 TeamCityビルドサーバーでこれを実行したいので、ソリューションランナーまたはmsbuildで実行する必要があります。パブリッシュターゲットを使用してみましたが、ClickOnceに適していると思います。

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

基本的には、Web展開プロジェクトとまったく同じことを行いたいのですが、アドインは使いません。 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>
204
jrummell

ほとんどの場合、カスタムmsbuildスクリプトなしで動作します。関連するTeamCityビルド構成設定は次のとおりです。

アーティファクトパス:%system.teamcity.build.workingDir%\ MyProject\obj\Debug\Package\PackageTmp 
ランナーのタイプ:MSBuild(MSBuildファイルのランナー)
ビルドファイルパス:MyProject\MyProject.csproj 
作業ディレクトリ:チェックアウトディレクトリと同じ
 MSBuildバージョン:Microsoft .NET Framework 4.0 
 MSBuild ToolsVersion:4.0 
 Run platform:x86 
ターゲット:パッケージ
コマンドラインパラメーターからMSBuild.exe:/p:Configuration=Debug

これにより、コンパイルされ、パッケージ化され(web.config変換を使用)、出力が成果物として保存されます。不足しているのは、指定された場所に出力をコピーすることだけですが、アーティファクト依存関係がある別のTeamCityビルド構成またはmsbuildスクリプトのいずれかで実行できます。

更新

これは、コンパイル、パッケージ(web.config変換を使用)、および出力をステージングサーバーにコピーするmsbuildスクリプトです。

<?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>

PropertyGroupタグからSolutionNameプロパティとProjectNameプロパティを削除して、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.Configurationenv.ProjectNameenv.DeployServiceUrlという名前のパラメーターがあります。 MSBuildランナーにはビルドファイルのパスがあり、パラメーターは自動的に渡されます(コマンドラインパラメーターで指定する必要はありません)。

コマンドラインからも実行できます:

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

VS 2012で導入された展開プロファイルを使用して、次のコマンドラインで公開できます。

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

パラメーターの詳細については、 こちらをご覧ください

76
Chris

私はそのような解決策を思いつきました、私にとってはうまくいきます:

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

秘密のソースは_WPPCopyWebApplicationターゲットです。

36

TeamCityがわからないので、これがあなたに役立つことを願っています。

これを行うために私が見つけた最良の方法は、MSDeploy.exeを使用することです。これは、Microsoftが実行するWebDeployプロジェクトの一部です。ビットをダウンロードできます こちら

WebDeployでは、コマンドラインを実行します

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

これは、VS Publishコマンドと同じことを行い、必要なビットのみを展開フォルダーにコピーします。

26
Jeff Siver

VisualStudio 2012では、プロファイルを公開せずにsubjを処理する方法があります。パラメーターを使用して出力フォルダーを渡すことができます。 'publishUrl'パラメーターの絶対パスと相対パスの両方で機能します。 VS100COMNTOOLSを使用できますが、%ProgramFiles%\MSBuild\Microsoft\VisualStudio\v11.0\WebApplications\Microsoft.WebApplication.targetsのターゲット「WebPublish」を使用するにはVisualStudioVersionをオーバーライドする必要があります。 VisualStudioVersion 10.0では、このスクリプトは出力なしで成功します:)

更新:Windows SDK 7.1のみがインストールされたビルドサーバー(このマシンにはVisual Studio 2010および2012はありません)でこのメソッドを使用することができました。しかし、私はそれを機能させるために次の手順に従わなければなりませんでした:

  1. Simmoの回答( https://stackoverflow.com/a/2907056/2164198 )を使用して、マシン上でWindows SDK 7.1を最新にします。
  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%
13
Ivan Samygin

環境を設定する必要があります

  • <Webサイト名>
  • <ドメイン>

そして私のブログを参照してください。

  • 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
    
3
Kim Ki Won

この私のバッチファイル

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
1
Alim İŞÇİ

パブリッシュ出力を生成するには、もう1つのパラメーターを提供します。 msbuild example.sln/p:publishprofile = profilename/p:deployonbuild = true/p:configuration = debug/or any

0

これは私の作業バッチです

publish-my-website.bat

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%

.Net FrameworkフォルダーのMsBuild.exeが機能しないため、MsBuild.exeを実行できるようにサーバーにVisual Studioをインストールしたことに注意してください。

0
Alper Ebicoglu