如何使用msbuild发布Web?

jru*_*ell 208 asp.net msbuild teamcity visual-studio-2010 msdeploy

Visual Studio 2010具有"发布"命令,允许您将Web应用程序项目发布到文件系统位置.我想在我的TeamCity构建服务器上执行此操作,因此我需要使用解决方案运行程序或msbuild.我尝试使用Publish目标,但我认为这可能适用于ClickOnce:

msbuild Project.csproj /t:Publish /p:Configuration=Deploy
Run Code Online (Sandbox Code Playgroud)

我基本上想要完成Web部署项目的功能,但没有加载项.我需要它来编译WAP,删除执行不必要的任何文件,执行任何web.config转换,并将输出复制到指定的位置.

我的解决方案基于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>
Run Code Online (Sandbox Code Playgroud)

jru*_*ell 136

我得到它主要工作没有自定义msbuild脚本.以下是相关的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脚本中完成.

更新

这是一个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>
Run Code Online (Sandbox Code Playgroud)

您还可以从PropertyGroup标记中删除SolutionName和ProjectName属性,并将它们传递给msbuild.

msbuild build.xml /p:Configuration=Deploy;SolutionName=MySolution;ProjectName=MyProject
Run Code Online (Sandbox Code Playgroud)

更新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>
Run Code Online (Sandbox Code Playgroud)

在TeamCity中,我有参数named env.Configuration,env.ProjectNameenv.DeployServiceUrl.MSBuild运行器具有构建文件路径,并且参数自动传递(您不必在命令行参数中指定它们).

您也可以从命令行运行它:

msbuild build.xml /p:Configuration=Staging;ProjectName=MyProject;DeployServiceUrl=http://staging-server/MSDeployAgentService
Run Code Online (Sandbox Code Playgroud)

  • 谢谢 - 这也很好地直接来自powershell(格式化道歉 - 评论中没有回车):&msbuild"$ solution"/ p:"Configuration = $ configuration"; &msbuild"$ project"/ t:Package/p:"Configuration = $ configuration; _PackageTempDir = $ outputfolder" (2认同)

Chr*_*ris 78

使用VS 2012中引入的部署配置文件,您可以使用以下命令行进行发布:

msbuild MyProject.csproj /p:DeployOnBuild=true /p:PublishProfile=<profile-name> /p:Password=<insert-password> /p:VisualStudioVersion=11.0
Run Code Online (Sandbox Code Playgroud)

有关参数的更多信息,请参阅此处.

  • 使用VS2012 .NET 3.5,这不适用于部署到文件系统.它只是构建并且不进行部署. (6认同)
  • 你的/p:VisualStudioVersion=11.0救了我的命.我使用/p:VisualStudioVersion=12.0 for vs2013,它的工作正常. (2认同)

Ale*_*sky 37

我提出了这样的解决方案,对我很有用:

msbuild /t:ResolveReferences;_WPPCopyWebApplication /p:BuildingProject=true;OutDir=C:\Temp\build\ Test.csproj
Run Code Online (Sandbox Code Playgroud)

秘诀是_WPPCopyWebApplication目标.

  • 使用VS2012 .NET 3.5,我收到错误错误MSB4057:项目中不存在目标"_WPPCopyWebApplication".取出该部分导致部署而不部署任何视图 (4认同)
  • 什么是 _WPPCopyWebApplication 以及如何使用它 MSBbuild xml 配置文件/ (2认同)

Jef*_*ver 26

我不知道TeamCity所以我希望这对你有用.

我发现这样做的最好方法是使用MSDeploy.exe.这是Microsoft运行的WebDeploy项目的一部分.你可以在这里下载这些位.

使用WebDeploy,您可以运行命令行

msdeploy.exe -verb:sync -source:contentPath=c:\webApp -dest:contentPath=c:\DeployedWebApp
Run Code Online (Sandbox Code Playgroud)

这与VS Publish命令的作用相同,只将必要的位复制到部署文件夹.

  • 该产品有两件.集成到IIS中的部分需要Server 2008.命令行组件没有该要求; 我让它在我用于部署的Server 2003机器上运行. (2认同)

Iva*_*gin 13

使用VisualStudio 2012,有一种方法可以处理没有发布配置文件的subj.您可以使用参数传递输出文件夹.它适用于'publishUrl'参数中的绝对路径和相对路径.您可以使用VS100COMNTOOLS,但是您需要覆盖VisualStudioVersion以使用目标"WebPublish" %ProgramFiles%\MSBuild\Microsoft\VisualStudio\v11.0\WebApplications\Microsoft.WebApplication.targets.使用VisualStudioVersion 10.0,此脚本将成功,无输出:)

更新:我已经设法在安装了Windows SDK 7.1的构建服务器上使用此方法(在计算机上没有Visual Studio 2010和2012).但我必须按照以下步骤使其工作:

  1. 使用Simmo应答(/sf/answers/203493951/)使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%
Run Code Online (Sandbox Code Playgroud)


Pav*_*mak 11

发现两种不同的解决方案,工作方式略有不同:

这个解决方案的灵感来自alexanderb [link]的答案.不幸的是它对我们没用 - 有些dll没有被复制到OutDir.我们发现ResolveReferencesBuild目标替换可以解决问题 - 现在所有必需的文件都被复制到OutDir位置.

msbuild /target:Build;_WPPCopyWebApplication  /p:Configuration=Release;OutDir=C:\Tmp\myApp\ MyApp.csproj
这种解决方案的缺点是OutDir不仅包含用于发布的文件.

2.第一种解决方案运作良好但不如我们预期的那样.我们希望在Visual Studio IDE中具有发布功能 - 即只有应发布的文件才会被复制到Output目录中.正如已经提到的那样,第一个解决方案将更多文件复制到OutDir中 - 然后将用于发布的网站存储在_PublishedWebsites/{ProjectName}子文件夹中.以下命令解决了这个问题 - 只有用于发布的文件才会被复制到所需的文件夹中.所以现在你有了可以直接发布的目录 - 与第一个解决方案相比,你将在硬盘上节省一些空间.

msbuild /target:Build;PipelinePreDeployCopyAllFilesToOneFolder /p:Configuration=Release;_PackageTempDir=C:\Tmp\myApp\;AutoParameterizationWebConfigConnectionStrings=false MyApp.csproj
AutoParameterizationWebConfigConnectionStrings=false参数将保证连接字符串不会被作为特殊工件处理并且将被正确生成 - 有关更多信息,请参阅链接.


Alp*_*glu 5

这是我的工作批次

发布我的网站.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%
Run Code Online (Sandbox Code Playgroud)

请注意,我在服务器上安装了 Visual Studio 以便能够运行,MsBuild.exe因为MsBuild.exe.Net Framework 文件夹不起作用。