2009-01-05 111 views
8

我有一個Web服務,需要不同的環境(調試,測試,產品)不同的設置。爲這些不同的環境設置單獨的配置文件最簡單的方法是什麼?我在網上找到的所有東西都告訴我如何使用配置管理器來檢索設置,但不知道如何根據當前的構建配置找到特定的設置。如何設置解決方案配置特定的配置文件?

回答

4

我發現每個環境都有好幾個配置文件效果很好。即:

  • 配置\ local.endpoints.xml
  • 配置\ dev.endpoints.xml
  • 配置\ test.endpoints.xml
  • 配置\ staging.endpoints.xml
  • 配置\ prod.endpoints.xml

然後我鏈接到的這個使用內置的configSource屬性在web.config內或app.config中的「主」版本如

<appSettings configSource="config\endpoints.xml"/> 

然後,我會使用構建過程或部署過程將環境的正確配置複製到web.config所期望的名稱。

每個環境都清楚地標記和控制,而不需要混亂的佔位符。

+0

一旦我完成了生成後的拷貝行,這很好。我沒有測試它的部署,但在本地調試它的作品。 我有點失望,Visual Studio不能以更簡單的方式做到這一點。 – James 2009-01-06 05:25:19

0

我們使用幾種不同的方法。

Environment.MachineName.config(爲用戶)

 System.Configuration.ExeConfigurationFileMap fileMap = new System.Configuration.ExeConfigurationFileMap(); 

     if (System.IO.File.Exists(String.Format("./{0}.config", Environment.MachineName))) 
      fileMap.ExeConfigFilename = String.Format(@"./{0}.config", Environment.MachineName); 
     else 
      fileMap.ExeConfigFilename = "live.config"; 

     System.Configuration.Configuration config = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(fileMap, System.Configuration.ConfigurationUserLevel.None); 

#IF DEBUG debug.config

#IF TEST test.config

#IF PROD prod.config

  System.Configuration.ExeConfigurationFileMap fileMap = new System.Configuration.ExeConfigurationFileMap(); 

#if (DEBUG) 
      fileMap.ExeConfigFilename = "./debug.config"; 
#elif (TEST) 
      fileMap.ExeConfigFilename = "./test.config"; 
#else 
      fileMap.ExeConfigFilename = "./production.config"; 
#endif 

      System.Configuration.Configuration config = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(fileMap, System.Configuration.ConfigurationUserLevel.None); 

雖然它可能很乏味。

+0

要添加代碼示例,對不起 – 2009-01-05 21:50:22

1

在下一個版本的Visual Studio中,這個事情已經被宣佈爲一項新功能。 也許你可以在prebuild腳本中做到這一點;根據configurationname env變量替換配置文件。

+0

[引用需要]:P - 信息豐富,但你可以在那裏編輯一個鏈接,並提到這將是哪個版本? – annakata 2009-01-07 11:11:49

+0

這是他們稱之爲配置轉換的東西,它是新MSDeploy的一部分。我不確定它是否僅限於Web。作爲網絡期貨的一部分,它在PDC發佈。這裏提到:http://blogs.msdn.com/webdevtools/archive/2008/12/30/vs-2010-for-web-developer-previews.aspx – 2009-01-07 20:27:24

2

一種方法是維護3個不同的配置文件,並在部署時通過MSBuild選擇它們。

<Choose> 
     <When Condition="$(BuildEnvironment) == 'debug'"> 
      <PropertyGroup> 
       <ConfigFile>debug.config</ConfigFile> 
      </PropertyGroup> 
     </When> 
     <When Condition="$(BuildEnvironment) == 'test'"> 
      <PropertyGroup> 
       <ConfigFile>test.config</ConfigFile> 
      </PropertyGroup> 
     </When> 
     <When Condition="$(BuildEnvironment) == 'prod'"> 
      <PropertyGroup> 
       <ConfigFile>prod.config</ConfigFile> 
      </PropertyGroup> 
     </When> 
    </Choose> 

通過使用MSBuild任務,您可以重命名並將特定配置文件推送到正確的位置。

仍然有些繁瑣,這有額外的優勢,朝着one step build邁進。

0

使用預編譯指令。示例代碼:

 String configFile = String.Empty; 
#if Debug 
     configFile = @"debug.config"; 
#elif Test 
     configFile = @"test.config"; 
#elif Prod 
     configFile = @"prod.config"; 
#endif 
     Load(configFile); 

其中Load方法加載配置文件。

1

又一種選擇:切換到將應用程序配置存儲在數據庫中。我將類型值保存在數據庫中,以便對這些設置的管理更集中。然後我的配置文件有一個專門用於Config的連接字符串,它只有兩個鍵:唯一的應用程序ID值和配置版本(即「dev」,「test」等)。然後我只是將正確的配置文件部署到正確的環境。

這可能不是你正在尋找的;它是幫助管理配置數據的替代方案。

1

我在西安的回答中遇到的問題是,如果您添加一個新的配置設置/端點,您必須記住在多個文件中執行此操作。如果你忘記這麼做,那麼只有當你部署到受影響的環境時纔會發現(不好)。

相反,您可以擁有一個主配置,並使用regex/xmlpoke(nant)/ [your-favorite-text-manipulator]在構建/部署時按摩文件,爲每個環境插入正確的值,對於另一個文件中的所有環境(但關鍵是所有的一起)。

然後你只需要維護一個配置文件和一個環境設置文件 - 我認爲這使得維護更容易和更清晰的長期。

相關問題