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

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

我基本上想要做Web部署项目所做的事情,但是没有加载项.我需要它来编译WAP,删除执行中不必要的文件,执行任意web.config transformations,并将输出复制到指定位置.

My Solution,基于杰夫·西弗的回答

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

推荐答案

我让它在没有自定义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脚本完成.

Update

下面是一个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

Update 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

Asp.net相关问答推荐

ASP.NET Core 延迟加载始终返回 null

如何使多行的 TextBox 控件无法调整大小?

asp.net 单选按钮分组

如何在 C# 代码中获取当前项目名称?

如果站点在 localhost 或 127.0.0.1 上运行,如何判断 ASP.NET MVC 视图

如何在txt文件中保存异常?

将 ListItem 的 ASP.NET 列表数据绑定到 DropDownList 问题

在 asp.net 中调整图像大小而不会丢失图像质量

如何从 JS 访问 ViewBag

发布网站项目时临时路径太长

如何从后面的 ASP.NET 代码访问 HTML 表单输入

aspnet_compiler 发现错误版本的 System.Web.WebPages 1.0.0.0 而不是 2.0.0.0

回发不适用于 aspx 页面作为默认文档

Windows Azure PaaS(网络角色)的真正替代品?

如何使用restsharp下载文件

路由模板分隔符/不能连续出现 - 属性路由问题

如何直接在 .aspx 页面中访问 web.config 设置?

将 html 标记从 jquery 发布调用发送到 asp.net 页面时,从客户端检测到潜在危险的 Request.QueryString 值

重新生成designer.cs

SignalR 2.0 错误:无法加载文件或程序集 Microsoft.Owin.Security