2010-12-03 73 views
3

我正在尋找一個簡單的&優雅的方式來改變我的appsettings在web.config基於不同的環境,我有(dev/qa/test/stage/prod ),我手動更改appsettings,它非常繁瑣和耗時,我有大約幾十個設置......對於這種情況,最好的方法是什麼?我知道使用Environment variables的一個解決方案,但希望聽到最佳做法?更新web.config基於不同的服務器使用asp.net

回答

0

我更喜歡使用網頁的外部化部分。配置,像這樣:

<appSettings configSource="appsettings.config" /> 

然後appsettings.config看起來像這樣:

<appSettings> 
    <add key ...> 
</appSettings> 

這讓我保存在單獨的文件不改變應用程序的設置,同時還允許我編輯主web.conifig用於實際配置部分。 你可以對其他部分做同樣的事情 - 連接字符串,system.net(用於電子郵件配置)等。

我其實並不認爲VS2010的方式非常好,因爲它需要重新構建才能更改配置。用我的方式,它可以在沒有VS的情況下使用,所以我可以輕鬆修改我所有的環境。

2

如果可能的話升級你的應用程序ASP.NET 4

這個版本有一個web.config轉換功能,旨在解決正是這個問題:

+0

我使用VS2010但我們的督促服務器仍然3.5,所以我必須針對3.5框架。 – 2010-12-04 03:51:29

+0

嗯,如果你需要推出你自己的解決方案然後(這是一個很長的一段時間),你可能能夠從NuGet項目拉出web.config變換功能:http://haacked.com/archive/2010/11 /19/nuget-transformation.aspx – rtpHarry 2010-12-04 10:31:20

+2

@rtpHarry,@Chicagoland:您仍然可以在面向.NET 3.5的同時使用web.config轉換。該功能僅需要您使用VS2010。 – 2010-12-09 22:34:00

1

我通常會執行以下操作:

  1. 包括多個每個配置值的版本,每個環境一個
  2. 爲閱讀我的應用程序設置創建一個小類。在這個類中,創建一個檢測當前環境的函數。
  3. 對於每個設置,創建一個訪問器屬性,該屬性具有一個使用環境檢測功能確定要返回哪個值的開關。

它需要一些初始設置,但一旦配置完成,它將提供一種簡單且無憂的獲取配置值的方法。

1

如果您使用VS2010(NET工具版本4),那麼您可以進行網絡配置轉換並構建部署包以部署到分段,生產等。不管您的目標版本的asp.net是什麼。然後部署該軟件包和tada,您將在目標上安裝自定義配置文件。無需運行時間來解決它。我一直使用3.5作爲我使用VS2010使用的MSBuild 4的.NET目標版本。我的開發環境具有與我的生產環境和登臺環境不同的應用程序設置。

1

最終,我建議儘可能使用Visual Studio 2010中的Web.config轉換功能。

如果VS2010不是您的選擇,或者您不想使用配置轉換功能,請查看我剛纔提出的解決方案。它使用批處理文件和NANT腳本的組合來從單個模板和一個或多個替換文件生成配置文件。它幾乎不像Web.config轉換工具那樣強大,但它是一個非常有效的選擇。

http://blog.nathan-taylor.net/2009/10/webconfig-build-manager.html

1

此前VS2010,我們實際上命名我們web.prod.config,web.qa.config,等等。我想我們有一些偉大的forsight。

無論如何,在VS2008中,我們有一個作爲構建步驟的一部分執行的複製命令會根據我們構建的配置複製相應的配置文件。我們的常規web.config指向dev,我們使用TFS將其部署到其他環境。

0

我們使用Nant來編寫我們的構建和部署。

Nant會將web.config和app.config模板複製到項目文件期望的位置。與此同時,Nant用適當的QA環境值替換標記。

0

我知道你已經接受了一個答案,但是我根據不同的環境使用了具有不同配置文件的方法,並且這樣命名。

例如,我有appsettings.config.debug,appsettings.config.deploy,web.config.debug,web.config.deploy。

然後,我有一個預生成腳本運行批處理文件,該文件將與我當前的配置設置相關的配置文件複製到沒有配置設置後綴的文件中。只有在使用FC的文件不同時它纔會執行此操作。

我的預生成事件命令行代碼是:

"$(ProjectDir)copyifnewer.bat" "$(ProjectDir)web.config.$(ConfigurationName)" "$(ProjectDir)web.config" 

"$(ProjectDir)copyifnewer.bat" "$(ProjectDir)appsettings.config.$(ConfigurationName)" "$(ProjectDir)appsettings.config" 

而且我copyifnewer.bat文件是:

echo Config Maintenance 
echo Today's date of %date:~-4,4%\%date:~-10,2%\%date:~-7,2% 
rem echo Comparing two files: %1 with %2 
echo . 
if not exist %1 goto File1NotFound 
if not exist %2 goto File2NotFound 

fc %1 %2 
if %ERRORLEVEL%==0 GOTO NoCopy 

echo These files are NOT the same. Copying %1 over %2 
copy %1 %2 /y & goto END 

:NoCopy 
echo These files are the same. Nothing copied. 
goto END 

:File1NotFound 
echo %1 not found. 
goto END 

:File2NotFound 
copy %1 %2 /y 
goto END 

:END 
echo Done. 
echo . 

這對我的偉大工程。希望這可以幫助某人。

感謝, 斯科特

相關問題