如何使用msbuild发布Web?
Visual Studio 2010有一个“发布”命令,允许您将Web应用程序项目发布到文件系统位置。 我想在我的TeamCity构build服务器上执行此操作,所以我需要使用解决scheme运行器或msbuild执行此操作。 我尝试使用发布目标,但我认为这可能是ClickOnce:
msbuild Project.csproj /t:Publish /p:Configuration=Deploy
我基本上想做一个web部署项目,但没有加载项。 我需要它来编译WAP,删除任何不必要的执行文件,执行任何web.config转换 ,并将输出复制到指定的位置。
我的解决scheme ,基于杰夫·斯维尔的答案
<Target Name="Deploy"> <MSBuild Projects="$(SolutionFile)" Properties="Configuration=$(Configuration);DeployOnBuild=true;DeployTarget=Package" ContinueOnError="false" /> <Exec Command=""$(ProjectPath)\obj\$(Configuration)\Package\$(ProjectName).deploy.cmd" /y /m:$(DeployServer) -enableRule:DoNotDeleteRule" ContinueOnError="false" /> </Target>
我主要工作没有一个自定义的MSBuild脚本。 以下是相关的TeamCity构buildconfiguration设置:
工件path:%system.teamcity.build.workingDir%\ MyProject \ obj \ Debug \ Package \ PackageTmp 跑步者types:MSBuild(MSBuild文件的跑步者) build立文件path:MyProject \ MyProject.csproj 工作目录:与结帐目录相同 MSBuild版本:Microsoft .NET Framework 4.0 MSBuild ToolsVersion:4.0 运行平台:x86 目标:包装 MSBuild.exe的命令行参数:/ p:Configuration = Debug
这将编译,打包(使用web.config转换),并将输出保存为工件。 唯一缺less的是将输出复制到指定位置,但是可以在具有工件相关性的另一个TeamCity构buildconfiguration中或使用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>
您也可以从PropertyGroup标记中移除SolutionName和ProjectName属性,并将它们传递给msbuild。
msbuild build.xml /p:Configuration=Deploy;SolutionName=MySolution;ProjectName=MyProject
更新2
由于这个问题仍然有很多的stream量,我认为这是值得使用我的当前脚本使用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.Configuration
, env.ProjectName
和env.DeployServiceUrl
。 MSBuild运行程序具有构build文件path,参数自动传递(您不必在命令行参数中指定它们)。
您也可以从命令行运行它:
msbuild build.xml /p:Configuration=Staging;ProjectName=MyProject;DeployServiceUrl=http://staging-server/MSDeployAgentService
使用VS 2012中引入的部署configuration文件,可以使用以下命令行进行发布:
msbuild MyProject.csproj /p:DeployOnBuild=true /p:PublishProfile=<profile-name> /p:Password=<insert-password> /p:VisualStudioVersion=11.0
有关参数的更多信息, 请参阅此 。
我想出了这样的解决scheme,对我很好:
msbuild /t:ResolveReferences;_WPPCopyWebApplication /p:BuildingProject=true;OutDir=C:\Temp\build\ Test.csproj
秘诀就是_WPPCopyWebApplication target。
我不知道TeamCity,所以我希望这可以为你工作。
我发现这样做的最好方法是使用MSDeploy.exe。 这是Microsoft运行的WebDeploy项目的一部分。 你可以在这里下载这些位。
使用WebDeploy,您可以运行命令行
msdeploy.exe -verb:sync -source:contentPath=c:\webApp -dest:contentPath=c:\DeployedWebApp
这与VS Publish命令做同样的事情,只将必要的位复制到部署文件夹中。
使用VisualStudio 2012,可以在不使用发布configuration文件的情况下处理subj。 您可以使用parameter passing输出文件夹。 它可以在“publishUrl”参数中使用绝对path和相对path。 您可以使用VS100COMNTOOLS,但是您需要重写VisualStudioVersion以使用%ProgramFiles%\MSBuild\Microsoft\VisualStudio\v11.0\WebApplications\Microsoft.WebApplication.targets
目标“WebPublish”。 随着VisualStudioVersion 10.0这个脚本将成功,没有输出:)
更新:我已经设法使用这个方法在一个构build服务器上只安装了Windows SDK 7.1(在一台机器上没有Visual Studio 2010和2012)。 但是我不得不按照这些步骤来使它工作:
- 使用Simmo answer( https://stackoverflow.com/a/2907056/2164198 )在计算机上使Windows SDK 7.1保持最新状态
- 将registry项HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ VisualStudio \ SxS \ VS7 \ 10.0设置为“C:\ Program Files \ Microsoft Visual Studio 10.0 \”(根据需要使用您的path)
- 从我的开发人员机器复制文件夹%ProgramFiles%\ MSBuild \ Microsoft \ VisualStudio \ v11.0来构build服务器
脚本:
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%
发现了两种不同的解决scheme:
这个解决scheme的灵感来自alexanderb [link]的答案。 不幸的是,它没有为我们工作 – 有些DLL没有复制到OutDir。 我们发现用Build
targetreplaceResolveReferences
解决了这个问题 – 现在所有必要的文件都被复制到OutDir位置。
msbuild / target:Build; _WPPCopyWebApplication / p:Configuration = Release; OutDir = C:\ Tmp \ myApp \ MyApp.csproj
这个解决scheme的缺点是,OutDir不仅包含发布的文件。
2.第一个解决scheme运行良好,但不是我们所期望的。 我们希望在Visual Studio IDE中具有发布function – 即只有应该发布的文件才会被复制到输出目录中。 正如已经提到的第一个解决scheme将更多的文件复制到OutDir中 – 发布网站然后存储在_PublishedWebsites/{ProjectName}
子文件夹中。 以下命令解决了这个问题 – 只有用于发布的文件将被复制到所需的文件夹。 所以现在你可以直接发布目录 – 与第一种解决scheme相比,你将在硬盘上节省一些空间。
msbuild / target:Build; PipelinePreDeployCopyAllFilesToOneFolder / p:Configuration = Release; _PackageTempDir = C:\ Tmp \ myApp \; AutoParameterizationWebConfigConnectionStrings = false MyApp.csproj
AutoParameterizationWebConfigConnectionStrings=false
参数将保证连接string将不会被处理为特殊的工件,并将被正确地生成 – 更多信息请参阅链接 。
你必须设置你的环境
- <网站名称>
- <域>
并引用我的博客(对不起后是韩国人)
- 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
这是我的batch file
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