区分开发、登台和生产环境之间的 web.config

Posted

技术标签:

【中文标题】区分开发、登台和生产环境之间的 web.config【英文标题】:Differentiating web.config between dev, staging and production environments 【发布时间】:2010-11-27 05:30:09 【问题描述】:

在处理环境之间的 web.config 设置差异方面,有人有什么好的技巧吗?我考虑在我们的源代码控制系统中但在 Web 层次结构之外创建一个“配置”文件夹,并让部署过程复制适当的配置文件(web.dev.config、web.staging.config、web.production.config ) 在部署时放入 web 文件夹。我还看到了有关如何在应用启动时以编程方式更改配置设置(WCF 端点、连接字符串等)的帖子。

什么被认为是最佳实践,每个人在使用这些或其他方法时都有哪些经验?

2010 年 9 月更新

值得注意的是,Visual Studio 2010 通过web.config transforms 添加了此功能。当您使用构建配置管理器 (Build|Configuration Manager...) 为您的项目创建不同的配置(例如,Debug、Dev、Staging 和 Release)时,VS 会将 web.*.config 文件添加到解决方案中。默认 web.config 包含您将用于调试的基线设置。 web.release.config、web.staging.config 等包含 XSLT 转换,每当您基于活动构建配置发布项目时,这些转换都会应用。

【问题讨论】:

见***.com/questions/305447/… @PhilPursglove 这对企业库配置非常有用,但据我所知,它对其他配置设置没有帮助。环境之间的变化比连接字符串和数据库相关属性要多得多。 【参考方案1】:

我使用 CruiseControl.NET/NAnt,NAnt 有一个 XMLPoke 任务,允许您在构建时进入并使用 XPath 查询更改任何配置设置。

所以在我的每个构建目标(DEV、UAT、STAGING 等)中,我设置了一堆属性,然后调用主构建目标。主构建目标将所有属性的值和 XMLPokes 放入配置并构建。

【讨论】:

这就是我所做的,但我使用 MSBuild 和 MSBuild 社区任务来编辑 XML,而不是 NAnt【参考方案2】:

我见过并使用过的一种方法是在 web.config 中设置密钥以按名称区分计算机。

例如:

<add key="comp1.Environment"       value="DEV"/>
<add key="compdb1.Environment"     value="PROD"/>
<add key="compstage.Environment"    value="STAGE"/>

显然 comp1、compdb1 是实际的计算机名称。

然后你会设置类似的东西:

<add key="KeyName,DEV"   value="DevEnvironmentValue"/>

在您的代码中,您需要检查应用程序运行的环境,然后获取适当的密钥,例如。

private string GetKeyValue() 
    string machineName  = String.Concat(System.Environment.MachineName, ".Environment");
    string environment  = ConfigurationManager.AppSettings[machineName];
    string key          = String.Concat("KeyName", ",", environment);
    string keyValue       = ConfigurationManager.AppSettings[key];

    return keyValue;

【讨论】:

【参考方案3】:

有一个名为 Web Deployment project 的项目类型,可从 Microsoft 免费获得,让您可以完全做到这一点。您可以根据您的解决方案配置(调试、发布等)替换 web.config 的部分。我们使用了一年多,并且效果很好。它适用于 VS2005 和 VS2008。

希望这会有所帮助

【讨论】:

好点。但是 - 这对 winforms 和 Windows 服务应用程序(即 app.config 文件)有帮助吗? 可能不是因为这种项目使用了ASP.Net编译器,并且绑定了一个web应用项目。【参考方案4】:

我的方法是拥有多个配置文件。我将所有与环境无关的东西(即无论是开发、登台还是生产都无关紧要)放在 web.config 文件中。任何特定于环境的内容(即数据库连接信息、日志记录、调试设置等)我都放入特定于环境的 local.config 文件中。然后,您可以使用 configSource (http://weblogs.asp.net/fmarguerie/archive/2007/04/26/using-configsource-to-split-configuration-files.aspx) 在 web.config 中包含 local.config 设置

然后可以将 Web.config 检入源代码管理。不要签入 local.config 文件 - 这会迫使您在部署脚本中部署正确的文件。

【讨论】:

【参考方案5】:

虽然其他一些答案可能更合适,但我会在 2007 年添加 Matt Berseth rolled his own method...

总之,他将所有因环境而异的值保存在专有文本文件中,并在构建过程中使用自定义工具将值合并到 .config 文件中。

在对该帖子的评论中,Doron Yaacoby 还 cmets:

"MSBuild 社区中有一个任务 可以实现这一点的任务(以及更多) 为你,这叫做 XmlMassUpdate。 Ive written about it in my blog"

【讨论】:

【参考方案6】:

使用新的 VS,您可以使用 Web 配置转换。

在此处阅读更多信息:http://msdn.microsoft.com/en-us/library/dd465326.aspx

【讨论】:

我认为应该使用这个 当你意识到你不想存储密码是你的回购时,我总是觉得很好。总之 - 不行。【参考方案7】:

您需要为一个环境安装,而不是为一个环境构建。在现实世界中,您必须在产品中安装在 QA 中测试过的内容,不允许重新构建。至少在我的世界里是这样的。

【讨论】:

理论上是的。在现实中,或“真实世界”中,QA 和生产之间存在差异。由于服务器名称和凭据不同,即使是像连接字符串这样简单的东西也需要不同的配置。配置转换是有原因的。该构建是离线构建的,但它仍然是为目标环境量身定制的。【参考方案8】:

下面介绍如何在 VS2012 中添加可针对您的部署环境自定义的不同配置

    鼠标右键单击解决方案并选择配置管理器 单击配置管理器按钮 在“配置”列下,针对项目选择组合框 您要添加配置并选择 创建一个名为 TEST 的新配置并复制设置 从发布并选中创建新的解决方案配置复选框 在 Web.config 上单击鼠标右键 添加配置转换 然后你会得到一个额外的 web.config 例如 web.TEST.config

在此之后,您需要使用特定于您的 TEST 环境的一些转换来修改 web.TEST.config

【讨论】:

【参考方案9】:

简单的方法是有一个枚举,然后有一个基于服务器名称的 switch 语句(如果它的稳定名称)。

如果您需要获取详细信息,请致电 GetURIPath(),这里我给出了使用 url 的示例:

public class StaticData

    public enum enumEnvironment
    
        envNONE = 0,
        envLOC = 1,
        envDEV = 2,
        envTEST = 3,
        envPROD = 4
    
     private static enumEnvironment GetCurrentEnv()
    
        if (ConfigurationManager.GetSection("DBSettingsGroup/DBSettings") == null && ConfigurationManager.GetSection("DBSettings") == null)
        
            return enumEnvironment.envLOC;
        
        else
        
            NameValueCollection NVCollection = new NameValueCollection();
            NVCollection = (NameValueCollection)ConfigurationManager.GetSection("DBSettingsGroup/DBSettings");
            if(NVCollection == null)
            
                NVCollection = (NameValueCollection)ConfigurationManager.GetSection("DBSettings");
            

            string sEnv = NVCollection.GetValues("serverrole").ToString();

            switch (sEnv.ToUpper())
            
                case "DEV-ISOLATED":
                    return enumEnvironment.envDEV;
                case "DEVELOPMENT":
                    return enumEnvironment.envDEV;
                case "TEST":
                    return enumEnvironment.envTEST;
                case "PRODUCTION":
                    return enumEnvironment.envPROD;
                default:
                    return enumEnvironment.envNONE;
            
        
    
   public static string GetURIPath()
    
        switch (GetCurrentEnv())
        
            case enumEnvironment.envPROD:
                return "http://produrl/yourapp/api/";
            case enumEnvironment.envTEST:
                return "http://testurl/yourapp/api/";
            case enumEnvironment.envDEV:
                return "http://devurl/yourapp/api/";
            default:
                return "http://localhost/yourapp/api/";
        
    

【讨论】:

以上是关于区分开发、登台和生产环境之间的 web.config的主要内容,如果未能解决你的问题,请参考以下文章

Celery:如何用不同的工人区分不同的环境?

Unity中的环境变量在开发和生产之间有所不同

在生产服务器上管理演示/登台/现场之间的站点部署

vue-cli3区分开发和生产环境

Jquery 验证不适用于登台和生产系统

GItlab CI :- 如何使用 Gitlab-CI 在 Android 中创建多个 apk(如开发、登台和生产)?