2011-05-10 71 views
9

本想挑選那些MS的大腦構建/ VS這裏後建立的指數。Visual Studio 2010中 - 每開發商/機/環境web.config設置

我想有我的web.config條目每個用戶/機/環境定製。

我可以標記在web.config配置的我/多變的條目,並希望通過相應的用戶/ environment文件覆蓋這些條目,並希望有一個決定哪些條目的順序應該勝過其他條目是否在多個文件中找到。

爲如:web.config中有$ ConnectionString的進入和每用戶/環境中的自定義文件可能有潛在價值取決於上下文/配置的解決方案建立

這意味着更換$ ConnectionString中,我可能有一組文件,如下圖所示:

user_joe.config

 $connectionstring = db_where_joe_like_to_connect_to 

staging.config

 $connectionstring = db_where_staging_connect_to 

production.config

 $connectionstring = db_production 

所以如果喬編譯從他的開發框中的解決方案,在web.config應該有$的ConnectionString值 「db_where_joe_like_to_connect_to」。

我希望有可能是不涉及南特的解決方案。

希望有人可以投擲指針。

回答

7

您可以使用visual studio 2010的web.config轉換設置。

http://weblogs.asp.net/gunnarpeipman/archive/2009/06/16/visual-studio-2010-web-config-transforms.aspx

這將允許每個開發人員有他們能夠獲得合併爲他們構建設置的web.config中的一部分。

我們內部使用從各個地方拼湊起來的NET-因爲通常的出版過程中發生這種情況的事件,我們希望它在編譯時有發生。

添加BeforeBuild目標 所以 - 從文件的csproj:

 
<Target Name="BeforeBuild"> 
    <TransformXml Source="$(SolutionDir)Web.config" Transform="$(SolutionDir)Web.$(Configuration).config" Destination="$(SolutionDir)Web.$(Configuration).config.transformed" /> 
    </Target> 
    <PropertyGroup> 
    <PostBuildEvent>xcopy "$(SolutionDir)Web.$(Configuration).config.transformed" "$(SolutionDir)Web.config" /R /Y</PostBuildEvent> 
    </PropertyGroup> 


+0

感謝指點亞當。這有助於:) – thanikkal 2011-05-12 05:08:36

+1

這是一個可怕的建議。所以你說如果你有20個開發者,你應該創建20個不同的構建目標x構建類型的數量?這是一個維護噩夢。 – 2011-09-20 16:56:26

+1

Ouch。可怕的建議或困難的特點?如果你有更好的方法,我們願意提供更好的建議,否則我會考慮改寫爲'那是不幸的'。如果你想在發佈過程中發生這種情況,那很簡單。不幸的是,只爲了構建而發生額外的步驟。 – 2011-09-20 18:36:29

1

正如亞當說,他的回答,您可以種做到這一點使用的web.config變換。基本上你必須爲每個環境創建一個新的解決方案配置。請注意,每個開發人員都有一個可能很快變得不可或缺,因爲每個配置/平臺組合都可以擁有自己的構建設置。

另外,變換被ONLY網站包裝(調用目標包)期間施加。所以如果你想要使用它,這樣joe和sally可以在他們自己的機器上有不同的配置,這不會爲你做到這一點。

在這種情況下,你可能會更好過試圖讓相同的配置大家,不是讓CONFIGS到片段。每個環境之間的差異越大,您將需要部署的時間越長。

+0

同意,個性化配置可能會造成維護混亂,但我們的團隊是小,我希望他們知道他們在做什麼:) – thanikkal 2011-05-12 05:09:32

+1

好的,請記住,您的開發人員將不得不打包項目的變換,然後安裝它。所以這些轉換不會有助於日常開發。 – Andy 2011-05-12 12:26:43

2

我會建議在web.config條目中使用configSource屬性進行調試構建。然後,在您的測試和releae構建中,您可以使用數據轉換來插入測試和生產條目。

你會做這樣的事情:

<connectionStrings configSource="myLocalConnectionStrings.cfg" /> 

然後你有一個名爲myLocalConnectionStrings一個本地文件,你不簽入源代碼控制。在您的Web.config.Release中,您只需轉換connectionStrings部分以包含生產字符串並刪除co​​nfigSource屬性。

+0

我喜歡這個連接字符串,但是當你處理其他設置(應用程序設置,日誌配置等),沒有自定義配置提供程序,除了轉換或其他選擇嗎? – 2012-02-28 22:57:55

+0

@AdamTuliper - 它適用於web.config中的任何內容。我認爲它只適用於部分,但不適用於單個條目。所以你必須在本地版本中包含所有條目。僅供參考,您可以在內容中加入內容,但會被忽略。這給你一個很好的模板來創建你的自定義文件。 – 2012-02-28 23:18:04

0

這是一個T4解決方案。這適用於我的情況,因爲這是一個內部工具,只能由開發人員使用,因爲我不需要對「包含」文件進行進一步處理。

文件名App.tt.

<#@ template debug="false" hostspecific="true" language="C#" #> 
<#@ import namespace="System" #> 
<#@ import namespace="System.IO" #> 
<#@ output extension=".config" #> 
<# 
string pathToConfigurations = Host.ResolvePath("Configurations"); 
string pathToMachine = Path.Combine(pathToConfigurations, Environment.MachineName + ".config"); 
if (File.Exists(pathToMachine)) 
{ 
    Write(File.ReadAllText(pathToMachine)); 
} 
else 
{ 
    Write(File.ReadAllText(Path.Combine(pathToConfigurations, "App.config"))); 
} 
#>