实施持续部署时 app/web.config 中的环境特定配置

Environment-specific configuration in app/web.config when implementing continuous deployment

TL;DR;

如何在实施持续部署时使用 Visual Studio 和 TFS 2015 管理 app.config/web.config 中特定于环境的设置?

完整问题

我正在尝试使用 the built-in feature in TFS 2015 为我的 C# Visual Studio 2015 解决方案实施持续部署。我目前想知道我应该如何在依赖于环境的配置文件中设置设置(通常是数据库连接字符串)。

我基本上有 4 种不同的环境:生产、预生产、UAT 和集成。我不会部署到 Azure 或云端。一切都在我公司的服务器上。

我已经尝试实施在 this link 上提出的解决方案,但除非我误解了什么,否则我觉得这意味着我还必须标记我的 web.config 和 app.config 内部我的 Visual Studio 解决方案。我想避免这种情况,因为我想尽可能保持我和我队友的体验。我不希望我们必须修改另一个文件来管理我们的配置设置。

我也考虑过使用 XML 转换,这将在部署期间由 Powershell 任务触发。基本上,我将我的配置文件保持原样,并且该任务会在触发时修改配置文件(如 this link 上的建议)。但理想情况下,我想使用发行版的内置环境变量。此外,这意味着我的转换文件将作为我的解决方案的一部分签入。如果我需要更改它,我需要 运行 一个新的 build/deployment。我想避免这种情况。

所以没有一个解决方案是完全令人满意的。我想知道是否有其他一些工具或库可以完成这项工作。我找不到任何东西。如果没有什么,我想我可以想出一些带有 Powershell 任务的东西,但如果我可以避免重新发明轮子...

最后一件事,我想我可以在 Visual Studio 中创建一个基于 "Release" 的新配置,我会命名为 - 比方说 - "Deployment"。然后我将在此配置上使用 XML Transform 仅对配置文件进行标记,并按原样保留 Debug 和 Release。在我的 TFS 构建中,我将使用此配置将标记化的配置文件部署为工件,我最终可以使用 Powershell 脚本和环境变量对其进行更新,就像上面第一个 link 中那样。但是好像太复杂了,涉及的东西太多了。我确定可以做一些更简单的事情。

还有 this solution,但这意味着 1 个环境 = 1 个构建。我绝对想避免这种情况。我想要 1 build = deploy everywhere.

如果您希望在部署时在不同的发布环境中更改 app.config/web.config 中的数据库连接字符串等设置,您可以下载此 Release Management Utility tasks extension 并为您的 TFS 集合安装它.使用 Tokenize with XPath/Regular 步骤更改相应的值。

在这一步中,它提供了很多方法来替换文件中的值。对于大多数方法,您需要更改连接字符串,例如:_ConnectingValue_。如果你不想添加这个符号(_),你可以使用下面的方法:

  1. 您的 web.config 文件可能是这样的:

代码:

  <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <appSettings>
        <add key="TestKey1" value="Old Value" />
      </appSettings>
    </configuration>
  1. 创建一个 .json 文件:

代码:

{
      "Default Environment":{
          
          "ConfigChanges":[
             {
                "KeyName":"/configuration/appSettings/add[@key='TestKey1']",
                "Attribute":"value",
                "Value":"New value"
             }
          ]
       }
    }
  1. 然后您的旧值将更改为新值。

结果:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
    <add key="TestKey1" value="New value" />
  </appSettings>
</configuration>

要了解有关此步骤的更多信息:

  1. Using Tokenization for Builds/Releases in vNext/TFS 2015

  2. VS 2015 Release Management Tokenize XPath/Regular expressions not working