223

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

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

私は基本的に、アドインなしで、Web 展開プロジェクトとまったく同じことをしたいと考えています。WAP をコンパイルし、実行に不要なファイルを削除し、web.config 変換を実行し、出力を指定された場所にコピーするために必要です。

My Solution、Jeff Siverの回答に基づく

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

12 に答える 12

140

カスタム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>

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.Configurationenv.ProjectNameとという名前のパラメーターがありますenv.DeployServiceUrl。MSBuild ランナーにはビルド ファイル パスがあり、パラメーターは自動的に渡されます (コマンド ライン パラメーターで指定する必要はありません)。

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

msbuild build.xml /p:Configuration=Staging;ProjectName=MyProject;DeployServiceUrl=http://staging-server/MSDeployAgentService
于 2010-06-23T02:49:24.673 に答える
42

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

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

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

于 2011-07-20T15:42:09.327 に答える
29

私は TeamCity を知らないので、これがうまくいくことを願っています。

これを実行する最善の方法は、MSDeploy.exe を使用することです。これは、Microsoft が運営する WebDeploy プロジェクトの一部です。ビットはここからダウンロードできます。

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

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

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

于 2010-06-23T13:31:55.250 に答える
13

VisualStudio 2012では、プロファイルを公開せずに接続法を処理する方法があります。パラメータを使用して出力フォルダを渡すことができます。'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の回答(https://stackoverflow.com/a/2907056/2164198)を使用して、マシン上でWindowsSDK7.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%
于 2013-03-13T14:15:46.080 に答える
12

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

1. このソリューションは、alexanderb [リンク]からの回答に触発されています。残念ながら、うまくいきませんでした。いくつかの dll が OutDir にコピーされませんでした。targetに置き換えるResolveReferencesBuild問題が解決することがわかりました。必要なすべてのファイルが OutDir の場所にコピーされるようになりました。

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

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

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

于 2014-01-16T13:44:45.673 に答える
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
    
于 2015-04-03T16:22:49.837 に答える
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
于 2015-06-05T15:05:51.440 に答える