39

致力于为多种解决方案集中配置、应用程序设置和连接字符串,同时切换到使用命令行中的 msdeploy 来部署 Web 应用程序。理想情况下,我希望构建包一次,并在将包部署到每个环境时获得最新的配置。我需要一些关于最佳方法的建议。

  1. 使用 Parameters.xml 和 SetParameters.xml 文件动态换出设置和连接字符串。见http://vishaljoshi.blogspot.com/2010/07/web-deploy-parameterization-in-action.html
  2. 使用 machine.config 或服务器级别的 web.config 文件来存储常见的应用程序设置和连接字符串。
  3. 使用来自https://github.com/sayedihashimi/package-web的 packageweb NuGet 包,它可以使用 web.config 转换和 msdeploy。
  4. 使用 file 或 configSource 属性以及 SetParameters 来指向不同的配置文件,但必须与 Web 根目录相对。
  5. 使用发布配置文件。请参阅 使用发布配置文件部署现有包

谢谢

4

4 回答 4

20

我可以详细说明选项#1/#3 并比较它们。之前的回复是不准确的说你必须用PackageWeb构建多次,你只需要构建一次。

选项 1:Parameters.xml 和 SetParameters.xml

在这种方法中,您将在您的 Web 项目中创建一个 parameters.xml 文件,该文件将声明其他 Web 部署参数。

构建 Web 部署包时,将在包中创建在 parameters.xml 中声明的参数。创建此 Web 部署包时,web.config 文件将根据构建配置进行转换(现在也可能是特定于配置文件的转换)。

您可以使用该包和 setparameters.xml 来发布指定 Web 部署参数值的包。您可以创建不同的 setparameters.xml 文件并将其与同一个包一起使用以发布到多个目标。要使用此技术发布,您可以使用 VS 生成的 deploy.cmd 或使用正确的参数集调用 msdeploy.exe。

选项 3:PackageWeb

PackageWeb 扩展了包过程,因此当您创建 Web 部署包时,包中包含 web.config 转换以及可以执行转换的程序集。

除此之外,当您创建 Web 部署包时,还会生成一个 publish-interactive.ps1 文件。你可以使用这个文件来发布你的包。它会提示您;要应用的 web.config 转换、Web 部署参数值和 Web 部署端点信息本身。当您运行发布时,您提供的值将保存到publish-configuration.ps1.readme. 您可以删除 .readme 并且 publish-interactive.ps1 将使用该文件中的值来自动发布。您还可以指定要用于设置的文件

如果您在 VS 创建 web 部署包时创建了 parameters.xml 文件,它将导致 web 部署参数包含在包中。PackageWeb 会选择这些并提示您。

那么这些方法之间有什么区别呢?

使用选项#1,进入包的 web.config 已经被转换。您将没有机会再次转换文件。使用这两种方法,您都可以指定 Web 部署参数值,以便满足您的需求。如果您将大块的 XML 从一个环境修改到另一个环境,那么 web.config 转换可能会有所帮助。所以 PackageWeb 可能是更好的选择。

使用选项#1,您必须手动创建 SetParameters.xml 文件。使用 PackageWeb,您可以使用 WhatIf 选项运行该过程。系统将提示您输入值,它会为您创建设置文件。

您可以轻松地自动化这两种方法。PackageWeb 本质上建立在parameters.xml/setparameters.xml 技术之上,并提供了一个超集的功能。

如果您想用最少的移动部件使事情尽可能简单,我会推荐选项 #1,因为如果需要,您可以直接调用 msdeploy.exe。

如果您想简化发布的自动化并且您更喜欢 PowerShell 而不是标准命令提示符,那么请尝试 PackageWeb。

我在http://sedodream.com/2012/03/14/PackageWebUpdatedAndVideoBelow.aspx在 PackageWeb 上有一个 5 分钟的视频。如果您要发布 Web 部署包,我鼓励你们尝试一下。如果它不能满足您的需求,请告诉我,因为我们以后可能会以更正式的方式使用我们在 PackageWeb 中学到的东西。

于 2012-11-11T22:04:50.883 回答
8

我们使用选项#1,效果很好。我们使用这种方法部署到大约 30-40 个站点和应用程序。

我认为选项 #2 会给您或开发人员带来麻烦。您必须确保在部署时从配置中删除带有设置的部分,或者将它们锁定在服务器上,以便本地配置无法添加它们。

对于选项 #3,您将必须进行多次构建才能获得转换后的配置文件。如果您要部署大量站点,这也不是很可行。

选项 #4 可以工作,但您可能会在此处遇到限制。要么整个​​部分在一个单独的文件中,要么全部在主文件中,因此没有中间。

选项 #5 看起来很有趣,但我没有使用它,所以我不能多说。

于 2012-11-06T19:47:20.430 回答
5

我们使用#5,效果很好。使用 MSBuild 发布配置文件提供了很多灵活性(项目特别有用)。

在我们的部署管道中,只有网站包、构建/部署目标和发布配置文件可用于部署阶段。源代码(包括项目文件)仅由构建/测试阶段使用。

仅供参考,我们专门使用了发布配置文件,因为您很快就会遇到将特定环境的服务器详细信息/凭据、跳过子句和参数值保存在一起的问题。WPP / Publish Profiles 跟踪文件中的所有这些内容pubxml,MSBuild 的功能允许为常见但“嘈杂”的任务提供一些不错的约定优于配置的“帮助程序”。

于 2012-11-11T23:14:04.463 回答
3

我最终解决了这个问题,结合在 TeamCity 上运行的 msbuild 来创建可供OctopusDeploy使用的 NuGet 包。

Octopus 允许打包成 nuget 包(构建一次)的应用程序通过多个环境推送。可以使用标准 ms 转换在每个环境甚至每台机器上转换配置。下面是相关 Octopus 文档的链接。

八达通包装

配置配置转换

于 2014-10-15T23:16:01.447 回答