代码之家  ›  专栏  ›  技术社区  ›  3Dave

区分dev、staging和production环境之间的web.config

  •  33
  • 3Dave  · 技术社区  · 15 年前

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

    这里的最佳实践是什么?每个人在这些或其他方法上都有哪些经验?

    SEP 2010更新

    值得注意的是,Visual Studio 2010通过 web.config transforms . 当使用构建配置管理器(build configuration manager…)为项目创建不同的配置(例如,调试、开发、登台和发布)时,vs会向解决方案中添加web..config文件。默认web.config包含用于调试的基线设置。web.release.config、web.staging.config等包含将在基于活动生成配置发布项目时应用的XSLT转换。

    9 回复  |  直到 6 年前
        1
  •  15
  •   Rob    14 年前

    使用新的vs,您可以使用web配置转换。

    在这里阅读更多: http://msdn.microsoft.com/en-us/library/dd465326.aspx

        2
  •  17
  •   Brian Frantz    15 年前

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

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

        3
  •  9
  •   Indeed is Trash    15 年前

    我使用cruisecontrol.net/nant,nant有一个xmlpoke任务,允许您在构建时进入,并使用xpath查询更改任何配置设置。

    因此,在我的每个构建目标(dev、uat、staging等)中,我设置了一组属性,然后调用主构建目标。主构建目标获取所有属性的值,并将其XML插入到配置和构建中。

        4
  •  8
  •   Jack Marchetti    15 年前

    我看到并使用的一种方法是在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;
    }
    
        5
  •  3
  •   mberube.Net    15 年前

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

    希望这会有帮助

        6
  •  3
  •   rohancragg    15 年前

    虽然其他一些答案可能更合适,但我会补充一点 Matt Berseth rolled his own method 回到2007…

    总之,他在一个专用文本文件中保留了环境之间的所有值,并在构建过程中使用自定义工具将这些值合并到.config文件中。

    在对这篇文章的评论中,Doron Yaacoby也评论道:

    “msbuild社区中有一个任务 能够实现这一点的任务(以及更多) 为你,这就是所谓的 XmlMassUpdate。 Ive written about it in my blog

        7
  •  3
  •   Nigel Findlater    11 年前

    下面介绍如何添加不同的配置,这些配置可以在VS2012中为部署环境定制。

    1. 右键单击解决方案并选择配置管理器
    2. 单击配置管理器按钮
    3. 在“配置”列下,针对项目选择组合框 要向其添加配置并选择
    4. 使用名称(如测试和复制设置)创建新配置 从发布并选中创建新解决方案配置复选框
    5. 在web.config上单击鼠标右键
    6. 添加配置转换
    7. 然后你会得到一个额外的web.config,例如web.test.config。

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

        8
  •  1
  •   j0k BlackMario    12 年前

    您需要为环境而不是为环境而构建。在现实世界中,你必须在prod中安装在qa中测试过的东西,不允许重建。至少在我的世界里是这样的。

        9
  •  0
  •   Joe    6 年前
     Easy way to have that is having an Enumeration , then having a switch statement based on the server name ( if its stable name ) .  
     Call GetURIPath() where ever you require to fetch details , here I given the examples for url's used 
    
    
    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/";
            }
        }
    

    }