2010-09-14 54 views
74

我們有幾個.NET項目,我們將某些設置存儲在配置文件中。 現在,每個開發人員都將擁有自己的配置文件,這些配置文件有點不同(不同的連接字符串以連接到本地數據庫,不同的WCF端點等)。開發人員在Visual Studio中的特定app.config/web.config文件

目前我們傾向於檢出app/web.config文件並修改他們適合我們的需求。 這會導致很多問題,因爲有時候會有人在從tfs獲取最新版本時檢查自己的設置或者自定義配置。

我的問題是:你如何處理這樣的情況?或者你根本沒有這個問題?

+4

我投票重新開放,因爲這是Visual Studio開發人員的常見問題,直接涉及開發人員正在使用的工具。 (因此得票) – 2017-06-09 17:25:02

+0

同意,這是一個長期存在的問題,因爲我們的團隊規模不斷擴大,各種解決方案的嘗試都不盡如人意。 – DiskJunky 2017-10-16 09:24:52

回答

3

我們使用machine.config來避免環境之間的web.config有差異。

+10

寧願要避免不得不改變machine.config – twarz01 2010-09-14 10:10:21

0

如何忽略文件,所以它永遠不會被檢入?我遇到了類似的問題,並且已經將web.config添加到Subversion中的忽略列表中。

但是在TFS中,這有點難度,請參閱this post瞭解如何操作。

0

您可以應對的一種方法是使用標記系統並使用rake腳本來更改值。

一個更基本的方法可能是在你的web.config一個鏈接到AppSettings.config文件所有的AppSettings(帶連接相似),即

<appSettings configSource="_configs/AppSettings.config" /> 

然後有一個文件夾與您的每一個開發人員在子文件夾中有一個版本(即/ _configs/dave /)。然後,當開發人員正在處理他們自己的代碼時,他們將從子文件夾複製到鏈接文件夾的根目錄。

您將需要確保您將更改傳達給這些文件(除非您使用標記)。如果您將AppSettings.config文件放在源代碼管理之外,並且只檢查開發者個人文件夾(所有文件夾),那麼他們將被迫複製正確的文件夾。

我更喜歡標記,但如果這只是一個快速修復,可能會更難以啓動和運行。

17

在你的web.config使用源來自其他文件

<configuration> 
    <connectionStrings configSource="ConnectionStrings.config" /> 
... 
</configuration> 

請版本控制在web.config並沒有爲ConnectionStrings.config做到這一點。 現在所有的開發人員都有一個連接字符串文件。

您可以對本地相關的所有設置執行此操作。

+1

這對我很好。另請參閱:http://davidgiard.com/2012/05/25/MovingConfigSectionsToExternalFiles.aspx ConnectionStrings.config文件必須位於與應用程序或Web配置相同的文件夾中。此外,您必須將其屬性更改爲'複製如果更新'來輸出。和ConnectionStrings。配置文件需要打開和關閉元素的完整部分。您還必須將版本控制設置爲忽略該文件,以便每個用戶都是特定的。 – 2017-04-17 18:24:46

+0

我使用了選項,因爲我必須合併設置 – Spikolynn 2017-08-23 06:05:33

1

忽略這些文件並且有一個Commom_Web.Config和Common_App.Config。使用具有構建任務的持續集成構建服務器,將其重命名爲正常名稱,以便構建服務器可以完成其工作。

+0

這需要在開發機器上完成,然後才能構建服務器 – twarz01 2010-09-14 10:10:48

+0

否這種重命名應該在構建服務器上發生。常見的配置文件存儲在subversion上,它們獨立於特定的開發者。 雖然每個開發人員都運行其個人配置文件在他的機器上開發,並且不關心提交它,因爲它不是Subversion的一部分。 – Arthis 2010-09-14 10:21:04

58

我們使用的系統結合了本頁面上的幾個現有答案,再加上了this suggestion by Scott Hanselman

簡而言之,我們所做的就是擁有一個通用的app.config/web.config,並在單個文件中具有大部分特定設置,正如其他答案所示。例如爲我們的SMTP設置,應用程序。配置包含

<system.net> 
    <mailSettings> 
    <smtp configSource="config\smtp.config" /> 
    </mailSettings> 
</system.net> 

此文件是在源控制。但是,像這樣的單個文件不是:

<?xml version="1.0" encoding="utf-8" ?> 
<smtp deliveryMethod="Network"> 
    <network host="127.0.0.1" port="25" defaultCredentials="false" password="" userName ="" /> 
</smtp> 

這並不是故事結束的地方。那麼新開發者或新鮮的源代碼安裝呢?大部分配置不再處於源代碼控制之中,手動構建所需的所有.config文件是一種痛苦。我更喜歡將源代碼至少編譯出來。

因此,我們在源代碼控制中保留.config文件的一個版本,名稱爲.config.default文件。因此,一個新的源樹是這個樣子:

alt text

不過,不是真的任何使用開發者,因爲到Visual Studio,他們只是毫無意義的文本文件。因此,批處理文件,copy_default_config.bat,負責從.config.default文件創建一組初始的.config文件:

@echo off 
@REM Makes copies of all .default files without the .default extension, only if it doesn't already exist. Does the same recursively through all child folders. 
for /r %%f in (*.default) do (
    if not exist "%%~pnf" (echo Copying %%~pnf.default to %%~pnf & copy "%%f" "%%~pnf" /y) 
) 
echo Done. 

該腳本安全地重新運行,可在開發商誰已經有自己的.config文件不會被覆蓋。因此,可以想象將這個批處理文件作爲預生成事件運行。對於新安裝,.default文件中的值可能不完全正確,但它們是合理的起點。

最終每一個開發者與最終是配置文件的文件夾,看起來是這樣的:

alt text

這似乎有點令人費解,但它絕對是最好的開發商踩着麻煩彼此的腳趾。

+0

爲什麼不直接在存儲庫中使用主.config文件,而是單獨使用.config文件。 – graffic 2011-11-21 08:17:54

+2

真是痛苦,我們需要更好的解決方案。我設置了類似的方法,並且厭倦了它非常脆弱,仍然需要向新開發人員解釋。 – jpierson 2012-01-20 07:49:42

+0

@Gavin,如果我嘗試運行您所概述的bat文件,則會收到錯誤消息:'∩╗┐@ echo'未被識別爲內部或外部命令,可操作程序或批處理文件。 – Austin 2015-06-19 13:48:09

0

我們有同樣的問題,我們正在做的是

  • 檢查與TESTSERVER /生產值在web.config
  • 開發者進入Windows資源管理器和更改文件
  • 的只讀模式
  • 編輯配置以適合其環境。
  • 只有在部署值發生更改或添加或刪除任何配置條目時,纔會檢入web.config。
  • 這需要評論的一個良好的金額爲每個配置項,因爲它需要每個開發
+0

這可能會在您使用的源代碼管理控制檯默認情況下只讀爲只讀的商店中更好地工作,但對於使用Subversion的其他商店,它可能無法正常工作。我們可以在存儲庫中設置只讀權限,以防止它被提交,但是需要在每個分支的每個配置文件上設置。 – jpierson 2012-01-20 21:35:27

0

假設你正在使用Visual Studio,你爲什麼不使用不同的解決方案配置是否會改變? 例如:您可以使用一個使用Web.config.debug的調試配置和一個使用Web.config.release的發佈配置。 Web.config.debug應該有類似

<appSettings file="C:/Standard_Path_To_Configs/Standard_Name_For_Config.config"> 

與文件Standard_Name_For_Config.config是GOTS所有的個人開發者設置,而Web.config.release總是有製作設置。 您可以將某些源控制文件夾中的默認配置存儲起來,並讓新用戶從該文件夾中取出它們。

19

這裏的web.config文件和Visual Studio 2010的解決方案:

1)手動編輯你的web應用的.csproj文件,添加一個AfterBuild目標是這樣的:

<Project> 
    ... 
    <Target Name="AfterBuild"> 
     <Copy SourceFiles="web.config" DestinationFiles="obj\$(Configuration)\tempweb.config" /> 
     <TransformXml Source="obj\$(Configuration)\tempweb.config" 
        Transform="web.$(USERNAME).config" 
        Destination="obj\$(Configuration)\tempweb2.config" /> 
     <ReadLinesFromFile File="obj\$(Configuration)\tempweb2.config"><Output TaskParameter="Lines" ItemName="TransformedWebConfig"/></ReadLinesFromFile> 
     <ReadLinesFromFile File="web.config"><Output TaskParameter="Lines" ItemName="UnTransformedWebConfig"/></ReadLinesFromFile> 
     <Copy Condition=" @(UnTransformedWebConfig) != @(TransformedWebConfig) " SourceFiles="obj\$(Configuration)\tempweb2.config" DestinationFiles="web.config" OverwriteReadOnlyFiles="True" /> 
    </Target> 
    </Project> 

這一目標將改造與當前開發者相對應的Web.config文件登錄 - 因此變量爲$(USERNAME),並在1)中創建相應的文件。 即使本地Web.config是源代碼控制的,它也會在每次構建內容更改(以避免重新啓動)時替換本地Web.config,這就是爲什麼OverwriteReadOnlyFiles設置爲True。這一點實際上是有爭議的。

2)爲項目中的每個開發人員創建一個名爲Web.[developer windows login].config的文件。 (例如,在下面的屏幕截圖我有一個名爲SMO和smo2兩個開發):

enter image description here

這些文件(1每顯影劑)可/應源控制。它們不應該被標記爲依賴主Web.config,因爲我們希望能夠單獨檢查它們。

這個文件的每一個表示一個轉換應用於主Web.Config文件。 轉換語法在這裏描述:Web.config Transformation Syntax for Web Application Project Deployment。我們重複使用Visual Studio提供的這個很酷的Xml文件轉換任務。此任務的目的是合併 Xml元素和屬性,而不是覆蓋整個文件。

例如,下面是一個示例web.[dev login].config改變命名的連接字符串「MYDB」,無論Web.config文件的其餘部分:

<?xml version="1.0"?> 
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"> 
    <connectionStrings> 
     <add name="MyDB" 
     connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True" 
     xdt:Transform="SetAttributes" xdt:Locator="Match(name)" /> 
    </connectionStrings> 
</configuration> 

現在,這個方案並不完美,因爲:

  • 建成後,開發商可能有不同的Web.Config局部比源控制系統
  • 他們可能從源頭上控制SYS得到一個新的Web.Config時強制本地寫tem
  • 開發人員不應該在主web.config中檢出/。它應該保留給少數人。

但是至少你只需要維護一個獨特的主web.config加上每個開發者一個轉換文件。

對於App.config(不是網頁)文件可以採取類似的方法,但我沒有進一步詳細說明。

+0

我將Web.config重命名爲Web.base.config,創建了一個新的Web.config文件,然後在步驟1中將更改爲 2014-12-17 00:30:09

+0

這仍然不是理想的,但我更喜歡它的另一種解決方案 – JMK 2016-09-27 09:25:38

+0

你認爲當web. $(USERNAME).config'不存在時可以使用'web.default.config'嗎?謝謝你的答案。 – 2017-07-19 13:55:44

相關問題