Team Build:使用 MSDeploy 在本地发布

Posted

技术标签:

【中文标题】Team Build:使用 MSDeploy 在本地发布【英文标题】:Team Build: Publish locally using MSDeploy 【发布时间】:2011-05-01 19:22:51 【问题描述】:

我刚刚开始使用团队构建功能,我发现做一些非常简单的事情需要做大量的事情,有点不知所措。我目前的设置是一个包含 Web 应用程序、程序集应用程序和测试应用程序的解决方案。 Web 应用程序设置了一个 PublishProfile,它通过文件系统发布。

我设置了一个 TFS 构建定义,目前它每晚构建整个解决方案,并将其放到网络共享上作为旧构建的备份。我现在要做的就是让我已经设置的 PublishProfile 为我发布 Web 应用程序。我确信这真的很简单,但我已经用 MSBuild 命令玩了一整天了,没有运气。救命!

【问题讨论】:

【参考方案1】:

很遗憾,发布配置文件的共享在 MSBuild 中不受支持或实施。从配置文件发布的逻辑包含在 VS 本身中。幸运的是,配置文件不包含太多信息,因此有一些方法可以实现您正在寻找的内容。我们的目标并不特别支持发布对话框所遵循的完全相同的步骤,但要从团队构建中获得相同的结果,您有两个选择,我将在此处概述。

当您设置 Team Build 定义以进行部署时,您需要为构建过程的 MSBuild 参数传递一些值。请参阅下面的图片,我在其中突出显示了这一点。

选项 1: 传入以下参数:

/p:DeployOnBuild=true;DeployTarget=PipelinePreDeployCopyAllFilesToOneFolder;PackageTempRootDir="\\sayedha-w500\BuildDrops\Publish";AutoParameterizationWebConfigConnectionStrings=false

让我稍微解释一下这些参数,显示结果然后解释下一个选项。 DeployOnBuild=true:这告诉项目执行DeployTarget 属性中定义的目标。

DeployTarget=PipelinePreDeployCopyAllFilesToOneFolder:这指定了 DeployTarget 目标。

PackageTempRootDir="\\sayedha-w500\BuildDrops\Publish":这指定了将写入包文件的位置。这是在打包文件之前写入文件的位置。

AutoParameterizationWebConfigConnectionStrings=false:这告诉 Web 发布管道 (WPP) 不要参数化 web.config 文件中的连接字符串。如果你没有指定这个,那么你的连接字符串值将被替换为占位符,比如 $(ReplacableToken_dummyConStr-Web.config Connection String_0)

完成此操作后,您可以开始构建,然后在 PackageTempRootDir 位置内,您将找到一个 PackageTmp 文件夹,其中包含您要查找的内容。

选项 2: 因此,对于上一个选项,您可能注意到它创建了一个名为 PackageTmp 的文件夹,如果您不希望这样做,则可以使用以下选项。

/p:DeployOnBuild=true;DeployTarget=PipelinePreDeployCopyAllFilesToOneFolder;_PackageTempDir="\\sayedha-w500\BuildDrops\Publish";AutoParameterizationWebConfigConnectionStrings=false

这里的区别在于,您将传入_PackageTempDir,而不是PackageTempRootDir。我不建议以 _ 开头的原因是因为以 _ 开头的 MSBuild 属性表示该属性本质上是“内部”的,因为在将来的版本中它可能意味着其他东西或根本不存在。所以使用风险自负。

选项 3

话虽如此,您可以只使用构建来打包您的网络。如果您想这样做,请使用以下参数。

/p:DeployOnBuild=true;DeployTarget=Package

当您在构建的放置文件夹中执行此操作时,您会像往常一样找到 _PublishedWebsites 文件夹,然后在其中会有一个文件夹 ProjectName_Package,其中 ProjectName 是项目的名称。该文件夹将包含包、.cmd 文件、参数文件和其他一些文件。您可以使用这些文件来部署您的网站。

我希望这不是信息过载。

【讨论】:

太棒了!玩弄了这些,还有一些事情要考虑。无论如何都要更好地了解正在发生的事情。要么使用它,要么在 IIS6 机器上安装 msdeploy 并按此方式进行。 谢谢你,我一直在寻找这个答案,我终于找到了你的帖子! 唯一缺少的是它不会创建 PrecompliedApp.config 文件。如果发布配置文件指定 PrecompliedApp 程序集,这些是否必要?我不明白为什么 TeamBuild 没有完成发布配置文件所做的所有事情,例如 XmlTransformations。 我们已经成功使用选项 2 一段时间了。但是,我们刚刚开始使用 SwashBuckle 为 WebApi 项目生成 Swagger 文档,并且这种发布方法不是将 .xml 文档文件复制到打包的 webapp 的 bin 目录中(Swashbuckle 需要)。稍微挖了一下,发现在命令行需要传递/p:ExcludeXmlAssemblyFiles=false.. 当我阅读这个答案时,我想,“这家伙应该写一本书。”你有!你应该拿出一个更新的版本。我会买的。【参考方案2】:

为 DEV->QA->RELEASE 周期发布网站、配置 IIS 和推送架构更改的能力需要自定义配置来模拟发布或涉及 IIS 设置的自定义代码。

从 Visual Studio 2013.2 开始,Microsoft 添加了一个第三方产品,用于管理网站部署、配置更改和使用 Windows 工作流的数据库部署,并且将成为从 TFS 构建自动部署的推荐解决方案。

更多信息可以在这里找到:

http://www.visualstudio.com/en-us/explore/release-management-vs.aspx

【讨论】:

【参考方案3】:

您可以在 Visual Studio 2010 中使用 Publish/Deploy。

更多信息请参见http://www.ewaldhofman.nl/post/2010/04/12/Auto-deployment-of-my-web-application-with-Team-Build-2010-to-add-Interactive-Testing.aspx

【讨论】:

虽然这不会通过文件系统发布,它假设 Web.Deploy.cmd 已经创建,这在我的情况下没有发生。当我右键单击网络应用程序并为发布方法选择发布时,我已经有了一个选项:文件系统,我只想插入它。

以上是关于Team Build:使用 MSDeploy 在本地发布的主要内容,如果未能解决你的问题,请参考以下文章

使用 MSDeploy 为包设置应用程序池

使用 msdeploy 转换文件

在 MSBuild、Team Build 和 TFS 中使用 PFX 文件对程序集进行签名

使用 msdeploy 转换文件

msdeploy仅跳过web.config root

使用 msdeploy 将 SQLCMD 变量传递给 dbDacFx 提供程序