2

我对 web.config 文件中的各种动态部分使用外部配置文件。基本上环境(Prod、UAT、Test、Dev 等)之间的所有动态变量都已外部化为通用命名的 .config 文件。

我的 web.config 也是通用的,因此所有环境都使用相同的 web.config(因为连接字符串等内容在外部文件中)。所有文件在不同环境中的名称都相同,因此当我们发布时,我们只需要在发布期间保持 web.config 和 \Configs* 目录完好无损。

我想要做的(通过 XSLT 或 PowerShell 之类的东西)是将这些外部 *.config 文件中包含的所有信息合并回 web.config,以便我可以将(现在合并的)web.config 与版本进行比较开发商提供。

所以我们现在的 web.config 可能会说:

<sessionState configSource="Configs\System.Web.SessionStateConnectionString.config" />

在 Prod 环境的 System.Web.SessionStateConnectionString.config 文件中有:

<sessionState mode="StateServer" cookieless="true" timeout="20"/>

并且对于测试环境有:

<sessionState mode="InProc" cookieless="true" timeout="20"/>

我想将所有外部 *.config 文件合并回 web.config 以便该文件基本上完成,就好像从未使用过 configSource 一样。这将允许我对 web.config 文件(在它被合并回来之后)以及开发人员提供给我们的内容执行 diff 或 WinMerge,显示哪些内容已更改,例如添加的新密钥或使用的新模块。

解决这个问题的最佳方法是什么?

4

1 回答 1

0

我没有简单的方法。我确实希望有一个存在,它会对我们双方都有帮助。

我发现在部署期间修改大量配置文件而不会出错的唯一可靠方法是进行实际的 XML 编辑。这意味着遵循 XML 结构。

这样,您尝试归档的任务不仅是更改 XML 值

<sessionState configSource="Configs\System.Web.SessionStateConnectionString.config" />

<sessionState configSource="abc.config" />

还要更改 XML 父级的名称

<sessionState configSource="abc.config" />

<sessionState mode="stateServer" />

然后,你需要附加更多的孩子才能做到

<sessionState mode="StateServer" cookieless="true" timeout="20"/>

因此,我将所需的所有环境变量保存在部署工具中,而不是使用另一个 XML 进行比较。在部署期间,我的部署脚本(powershell)直接加载配置文件$config = [xml](get-content $webconfig)并从部署工具加载变量

对于一个简单的改变,我会做

$node = $config.configuration.sessionState | where {$_.configSource -eq 'Configs\System.Web.SessionStateConnectionString.config'}
$node.configSource = $Prod_session_config #"abc.config"

对于您需要的更改,我将分离configSourcesessionState重新附加 3 个新子mode, cookielesstimeout以及它们所需的值。

话虽如此,这是一个非常冗长的部署脚本。您可以创建自己的助手以使其看起来更好,例如replace-config $config_keyname $config_keyvalue. 即使使用帮助程序来减少您需要的常见操作,这仍然很容易产生数千行代码,具体取决于您的应用程序有多少移动部件。

这可能需要数周时间才能完成。完成此操作后,不太可能对其进行任何大规模更改,但仍需要您与开发人员进行良好的沟通,您需要他们在引入新的环境相关变量时更新您。

这个任务也可以用 Puppet Augeas 之类的配置管理工具来完成,但是我觉得如果你在 powershell 中写下一些好帮手的话,这并不容易。我也研究了 XSLT,但找不到将它与我的部署工具一起使用的便捷方法。

这是我在 devops 经验有限的情况下的解决方案,我非常希望有一个和你一样更好的解决方案。

于 2016-04-16T02:25:12.173 回答