我有一個Web服務,需要不同的環境(調試,測試,產品)不同的設置。爲這些不同的環境設置單獨的配置文件最簡單的方法是什麼?我在網上找到的所有東西都告訴我如何使用配置管理器來檢索設置,但不知道如何根據當前的構建配置找到特定的設置。如何設置解決方案配置特定的配置文件?
回答
我發現每個環境都有好幾個配置文件效果很好。即:
- 配置\ 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所期望的名稱。
每個環境都清楚地標記和控制,而不需要混亂的佔位符。
我們使用幾種不同的方法。
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);
雖然它可能很乏味。
要添加代碼示例,對不起 – 2009-01-05 21:50:22
在下一個版本的Visual Studio中,這個事情已經被宣佈爲一項新功能。 也許你可以在prebuild腳本中做到這一點;根據configurationname env變量替換配置文件。
[引用需要]:P - 信息豐富,但你可以在那裏編輯一個鏈接,並提到這將是哪個版本? – annakata 2009-01-07 11:11:49
這是他們稱之爲配置轉換的東西,它是新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
一種方法是維護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邁進。
使用預編譯指令。示例代碼:
String configFile = String.Empty;
#if Debug
configFile = @"debug.config";
#elif Test
configFile = @"test.config";
#elif Prod
configFile = @"prod.config";
#endif
Load(configFile);
其中Load方法加載配置文件。
又一種選擇:切換到將應用程序配置存儲在數據庫中。我將類型值保存在數據庫中,以便對這些設置的管理更集中。然後我的配置文件有一個專門用於Config的連接字符串,它只有兩個鍵:唯一的應用程序ID值和配置版本(即「dev」,「test」等)。然後我只是將正確的配置文件部署到正確的環境。
這可能不是你正在尋找的;它是幫助管理配置數據的替代方案。
我在西安的回答中遇到的問題是,如果您添加一個新的配置設置/端點,您必須記住在多個文件中執行此操作。如果你忘記這麼做,那麼只有當你部署到受影響的環境時纔會發現(不好)。
相反,您可以擁有一個主配置,並使用regex/xmlpoke(nant)/ [your-favorite-text-manipulator]在構建/部署時按摩文件,爲每個環境插入正確的值,對於另一個文件中的所有環境(但關鍵是所有的一起)。
然後你只需要維護一個配置文件和一個環境設置文件 - 我認爲這使得維護更容易和更清晰的長期。
- 1. 確定解決方案配置(Visual Studio)
- 2. 如何通過配置文件設置Elastic Beanstalk解決方案堆棧?
- 3. 如何在Visual Studio解決方案文件中設置默認配置?
- 4. 如何整合asp.net解決方案中的配置文件?
- 5. 解決方案的主動配置SharpDevelop
- 6. VS解決方案中的ReSharper配置
- 7. 配置時間戳Rails(解決方案)
- 8. visual studio解決方案配置權
- 9. 如何綁定到來自XAML的解決方案配置?
- 10. 如何配置節點特定設置
- 11. 爲Jenkins使用的.NET解決方案配置構建文件
- 12. 從解決方案文件獲取當前配置的MSbuild
- 13. 如何配置AWS CodeCommit配置文件的特定回購
- 14. 如何配置Mercurial不提交特定的配置文件?
- 15. Netbeans配色方案設置
- 16. 如何爲單個方案配置多個WCF綁定配置
- 17. 在Visual Studio解決方案中以編程方式設置生成配置
- 18. 更改特定解決方案的TFS構建放置位置
- 19. 組織Guice綁定配置的解決方案
- 20. Tikiwiki如何設置「User_Tracker_Business」配置文件?
- 21. 機器特定的配置設置
- 22. 配置未定義特定的配置文件
- 23. 如何從Azure配置文件獲取所有配置設置?
- 24. 解析配置遠程配置文件
- 25. C#如何檢查解決方案配置
- 26. C#:如何獲得解決方案配置選項?
- 27. 如何包括基於主動解決方案配置
- 28. 如何爲多個解決方案配置TeamCity Inspections(.NET)Runner
- 29. 如何爲x86和x64同時配置VS2012解決方案
- 30. 大型解決方案,許多解決方案配置,添加新項目
一旦我完成了生成後的拷貝行,這很好。我沒有測試它的部署,但在本地調試它的作品。 我有點失望,Visual Studio不能以更簡單的方式做到這一點。 – James 2009-01-06 05:25:19