【问题标题】:How to override ASP.NET deployment parameters when publishing发布时如何覆盖 ASP.NET 部署参数
【发布时间】:2016-07-28 14:26:54
【问题描述】:

我已经看到了一些问题,阅读了所有帖子,但我仍然无法完成这项工作。要么我遗漏了什么,要么无法完成..

所以我有一个相当简单的(ASP.NET MVC)项目。 在我项目的根目录下有一个parameters.xml文件,里面有参数定义,比如:

<?xml version="1.0" encoding="utf-8" ?>
<parameters>
  <parameter 
   name="Realm"
   description="Realm for ADFS authentication"
   defaultValue="http://somewebsite">
   <parameterEntry 
      kind="XmlFile"
      scope="Web.config"
      match="/configuration/appSettings/add[@key='ida:Realm']/@value" />
   <parameterEntry 
      kind="XmlFile" 
      scope="Web.config"
      match="/configuration/system.identityModel/identityConfiguration/audienceUris/add/@value" />
<parameterEntry 
      kind="XmlFile" 
      scope="Web.config"
      match="/configuration/system.identityModel.services/federationConfiguration/wsFederation/@realm" />

到目前为止一切顺利。这个结构很好理解,部署参数的名称(例如“Realm”)是它的默认值,以及一些 XCLT 选项,可以在 Web.config 文件中找到。

现在,当我创建部署包时,通过运行 Publish,我得到一个目录,其中包含:

  1. 为部署自动生成的 cmd 文件
  2. 自述文件
  3. 清单 XML 文件
  4. 一个 zip 文件,其中包含必须部署到我的服务器的所有文件。
  5. .SetParameters.xml 文件

最后一个文件包含我在上面引用的 parameters.xml 文件中设置的参数值,这些值被设置为在那里定义的默认值。
例如如果Realm的默认值设置为http://somewebsite,在生成的部署SetParameters.xml中,我会得到这条记录:

<setParameter name="Realm" value="http://somewebsite" />

部署包后,这些值将从此 xml 文件中获取,并根据原始 parameter.xml 文件中定义的 XPath 替换我的 Web.Config 中的值。

现在,我想要在构建部署包时覆盖此参数(以及许多其他参数),因为不同的部署配置文件需要不同的值。

关键似乎是我的 .pubxml 文件,它负责发布设置。我尝试了很多选项,包括 Sayed Hashimi 所说的 here、之前给出的答案 hereherehere too(以及其他)......对于该死的参数似乎没有任何影响!

我错过了什么吗?有什么神奇的技巧吗?
我应该完全忽略参数而只依赖匹配的 web.config 转换吗?还有什么建议吗?也许将自定义目标添加到 .csproj 文件? (甚至尝试过...)

谢谢! 阿隆。

【问题讨论】:

    标签: asp.net deployment msbuild msdeploy web-publishing


    【解决方案1】:

    WebDeploy 参数化发生在部署时而不是构建时(如配置转换)。我们在工作中对 50 多种产品使用参数化并取得了巨大成功。对于每个产品,我们有 4 个 SetParameters 文件:

    • SetParameters.DEV.xml
    • SetParameters.QA.xml
    • SetParameters.UAT.xml
    • SetParameters.PROD.xml

    每个都有对其环境有效的参数值。我们使用 PowerShell 脚本和 Thoughtworks GO 使用适当的 SetParameters 文件在管道中执行 MSDeploy 包。

    请注意,请确保不要将您的 SetParameters 文件与您的应用程序一起部署 - http://dotnetcatch.com/2016/04/02/webdeploy-parameterization-tip-dont-publish-your-parameterization-files/

    另外,如果您想在 VS 中预览参数化,这可能会有所帮助 - http://dotnetcatch.com/2014/09/08/parameterizationpreview-visual-studio-extension/

    【讨论】:

    • 谢谢@chief7!我正在尝试使用现有工具减少工作并自动化流程。在我看来,没有办法将一组参数值绑定到发布配置文件(除非我在 msdeploy/build 之外添加一些体力劳动)。迄今为止唯一的解决方法:创建与发布配置文件名称匹配的 web.config 转换。这不会在构建期间更改 web.config,而只会在生成的部署包中更改。它也更强大,因为我可以根据部署环境对配置进行实际更改(例如,不同身份验证模式的不同 ConfigSections)。
    • 如果您希望通过构建过程进行部署,最好选择配置转换。但是请注意,这将要求您为每个环境部署进行构建,这会增加有人在构建之间检查新更改并将未经测试的代码引入上层环境的风险。祝你好运!
    • 再次感谢@chief7。顺便说一句,由于您似乎比我更有经验,假设我想用 SetParameters.DEV.xml 的内容覆盖部署文件夹(部署 cmd 文件旁边)中的 SetParameters.xml 文件(所以这些值在部署期间应用),您提到了一个 PowerShell 脚本,这是您复制/应用/运行它的方式吗?生成部署包时,它能否以某种方式从 .pubxml 文件中自动化?我只是觉得很奇怪,必须以某种方式手动覆盖每个发布配置文件的 parameters.xml 文件中的“默认值”......
    • 我查看了但找不到在使用发布配置文件时覆盖 SetParameters 文件的方法。发布配置文件只是 MSBuild 的扩展。在 MSBuild 过程之外,我们使用 PowerShell 脚本调用 MSDeploy.exe 并使用自定义 SetParameters.[env].xml 部署包。
    • 我搞定了。我的 xpath 中缺少 /@value
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-21
    • 2018-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多