msbuildでWebを公開する方法


216

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


@SnOrfus私は現在VS 2008でWeb配置プロジェクトを使用しています(その質問に対する私の回答で述べたように)が、代わりにVS 2010の発行機能を自動化してみたいと思います。
jrummell 2010年

この質問は便利になりますstackoverflow.com/questions/1983575/...を
jrummell

2
スクリプトのほんの少しの修正:展開スクリプトに$(ProjectPath)を使用していますが、本当に必要なのは$(ProjectDir)です。それ以外の場合は、.csproj \ objで終了します
Troy Hunt

2
VS2012以降では、これははるかに簡単です:stackoverflow.com/a/13947667/270348
RobSiklos

回答:


137

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

アーティファクトパス:%system.teamcity.build.workingDir%\ MyProject \ obj \ Debug \ Package \ PackageTmp 
ランナーのタイプ:MSBuild(MSBuildファイルのランナー) 
ビルドファイルのパス:MyProject \ MyProject.csproj 
作業ディレクトリ:チェックアウトディレクトリと同じ 
MSBuildバージョン:Microsoft .NET Framework 4.0 
MSBuildツールバージョン:4.0 
実行プラットフォーム: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配置(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.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.(2番目の更新はWebDeployを使用することを記述しているため、最初の更新はまだWebDeployを使用しないことを示唆している可能性があります。)
chiccodoro

@jrummell:私のVisual Studio WebプロジェクトをTeamCityからリモートのWindowsサーバーにデプロイしたい。私は何をすべきか。私は初心者で、何をすべきかわからない
Nevin Raj Victor

1
これをWebアプリケーションプロジェクトを使用してTeamCityで動作させることができますが、(パッケージとして)公開し、MSDeployを使用する必要があるレガシーバインドされたWebサイトプロジェクトもあります。VS2013内で公開する場合、展開パッケージを取得しますが、cmd行からのMSBuildはそれを作成しません。何かご意見は?
KnowHowSolutions 2015年

1
これにはパブリッシュプロファイルについての言及はありません。正しいweb.config変換が適用されるように、発行プロファイルを指定する必要があります。更新:Nevermind ...この機能は、この投稿から2年後に導入されました。これはおそらくまだ機能します。このスレッドの後半の投稿では、コマンドラインから発行プロファイルを使用して発行する方法を示しています。
Triynko、

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を使用すると、これはファイルシステムへの展開には機能しませんでした。それは単にビルドし、デプロイメントは行いません。
Jay Sullivan、

2
/p:VisualStudioVersion=11.0が私の命を救った。vs2013には/p:VisualStudioVersion=12.0を使用していますが、正常に動作します。
Seyed Morteza Mousavi 2014

/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。これがファイルのコピーの問題に関連しているかどうかはわかりません。
クリス

38

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

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

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


1
_WPPCopyWebApplicationとは何ですか、またどのように使用できますかMSBbuild xml config file /
Johnny_D

4
VS2012 .NET 3.5を使用すると、エラーが発生しましたerror MSB4057: The target "_WPPCopyWebApplication" does not exist in the project。その部分
Jay Sullivan

ビルドではc:\ programファイル(x86)\ msbuild \ microsoft \ visualstudio \ VERSION \ Webapplication \ Microsoft.WebApplication.targetsのターゲットを使用するため、別の/p:VisualStudioVersion=12.0で呼び出す必要がある場合があります。正しいターゲットを持たない古いバージョン。
ジムウォルフ

@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。これに対する解決策はありますか?
Nevin Raj Victor

1
@NevinRajVictorこのエラーは、DeployIisAppPath値にスペースがあるために発生する可能性があります。値を引用符で囲む必要があります。例えば/ P:DeployIisAppPath = "既定のWebサイト/新規"
しいたけ

27

私はTeamCityを知りませんので、これがあなたの役に立つことを願っています。

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

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

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

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


それは有望に見えます。ただし、管理サービスはServer 2008でのみ使用できるようです。ステージングサーバー(展開を自動化する場所)でWindows 7 Proを実行しています。
jrummell 2010年

2
商品には2個あります。IISに直接統合する要素にはServer 2008が必要です。コマンドラインコンポーネントにはその要件はありません。展開に使用するServer 2003ボックスで実行しています。
Jeff Siver

MSDeployについていくつか読んだことがあります。私はそれをインストールして私のステージングサーバーで作業しています、ありがとう!MSBuildスクリプトからMSDeployを実行できますか?
jrummell 2010年

1
VS Publishコマンドのどの構成と同じことですか?ファイルシステムまたはその他の公開方法 MyProject.Publish.xmlファイルを使用して、コピーするファイルを決定しますか?
Anthony

1
試してみただけですが、VS Publishと同じことはしませんでした。すべてのソースファイルを含むXCopyと同じです。
Louis Somers

13

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

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

  1. Simmo Answer(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%

この解決策をありがとう-これは私が探していたものです:ファイルシステムの展開によるWebPublishオプション。
woohoo 2017年

12

わずかに異なる方法で機能する2つの異なるソリューションが見つかりました。

1.このソリューションは、alexanderb [リンク]からの回答に着想を得ています。残念ながらそれは私たちにとってはうまくいきませんでした-一部のDLLはOutDirにコピーされませんでした。ターゲットに置き換えるResolveReferencesBuild問題が解決することがわかりました-これで、必要なすべてのファイルがOutDirの場所にコピーされます。

msbuild / target:Build; _WPPCopyWebApplication / p:Configuration = Release; OutDir = C:\ Tmp \ myApp \ MyApp.csproj
このソリューションの欠点は、OutDirにパブリッシュ用のファイルだけが含まれていないことでした。

2.最初の解決策はうまく機能しますが、期待どおりではありません。Visual Studio IDEと同じように公開機能を使用したいと考えました。つまり、公開する必要があるファイルのみが出力ディレクトリにコピーされます。すでに述べたように、最初のソリューションははるかに多くのファイルをOutDirにコピーし_PublishedWebsites/{ProjectName}ます。公開用のWebサイトはサブフォルダーに保存されます。次のコマンドはこれを解決します-公開用のファイルのみが目的のフォルダーにコピーされます。これで、直接公開できるディレクトリが作成されました。最初のソリューションと比較して、ハードドライブのスペースを節約できます。

msbuild / target:Build; PipelinePreDeployCopyAllFilesToOneFolder / p:Configuration = Release; _PackageTempDir = C:\ Tmp \ myApp \; AutoParameterizationWebConfigConnectionStrings = false MyApp.csproj
AutoParameterizationWebConfigConnectionStrings=falseパラメータは、接続文字列が特別なアーティファクトとして処理されず、正しく生成されることを保証します。詳細については、リンクを参照してください


オプション#2は、廃止された_CopyWebApplicationをシームレスに取り除くのに役立ちました。VS 2015にアップグレードした後、あなたは私のビルドサーバーを救いました。感謝しています。
it3xl 2017年

オプション#2は、私のビルドスクリプトに最適でした。
AnthonyVO

3

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

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

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

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

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.exeMsBuild.exeinフォルダーが機能しないため、実行できるようにVisual Studioをサーバーにインストールしたことに注意してください。


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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.