2009-02-10 62 views
6

所以,我今天通過檢查配置文件殺死了這個版本。它知道服務器在哪裏(思考SQL服務器或類似的東西),而且我一直在對付我的盒子上運行的服務器。通常,或者說,在其他情況下,我們會對中央服務器運行。每天的構建,當然,沒有找到'我的'服務器,因此破損。然後,在簽入之前再次編輯配置文件以指向「普通」服務器,並在簽入之後再次編輯它。半編輯文件(例如配置文件)和版本控制 - 最佳實踐?

我一直試圖讓VC只是忽略配置文件,所以它不會在意外檢查。另一方面,存儲庫應該包含一個乾淨的,可用的文件版本。我不可能忽視它,並在同一時間檢查它,現在,我可以嗎?

所以,我正在尋找的是一個文件,其中,錯誤,檢查出來,但從不檢查。至少在最常見的情況下 - 如果配置文件發生顯着變化,一些特殊將新版本存入存儲庫的過程是可行的。

如果您以前遇到過這個問題,我會對您找到的任何解決方案感興趣。只要他們不打破構建,那是;)

回答

11

你可以做的是有一個默認配置文件保持不變,除非添加一些新的配置。然後你有一個覆蓋默認文件配置的不同文件。

config.Default.xml 
config.User.xml 

只有config.Default.xml是源代碼管理的。 config.User.xml僅包含對您而言不同的配置。因此,假設您正在本地SQL服務器上進行測試,則只需將連接字符串放在那裏,它將覆蓋config.Default連接字符串。

看看.Net框架應用程序配置,它會爲您完成大部分(如果不是全部)工作。

2

我使用的一種方法是有兩個版本的配置文件,並有安裝程序腳本拉正確的版本。

  • 的settings.xml
  • 的settings.xml釋

兩個文件都包含相同的密鑰,但一個包含「開發」值,另一個包含的值我們預計部署和編輯在該領域。

+0

當然,這仍然讓我們在多個實例做這項工作的事有一個文件工作的問題,但不是其他 – 2009-02-10 21:23:26

+0

,但我得承認我不喜歡Coincoin的回答更好。 ;) – JMD 2009-02-10 21:48:40

0

如果我工作,我們有單獨的部署配置文件。所以我們解決方案中的配置文件是開發版本,人們可以將它們更改爲他們心中的內容。這些配置文件從不在任何地方部署。

部署的配置文件存儲在我們的源代碼管理提供程序的單獨位置。如果有人需要進行配置更改,那麼他們必須修改此版本。

1

我們將這些文件存儲在我們的源代碼管理系統中,並且針對我們正在構建的環境擁有不同的文件夾。

因此,我們有:

Dev 
Test 
Live 

有下這些子文件夾用於其他環境特定的文件。

1

我們有

  • *。(配置| XML)
  • *。(配置| XML).cert
  • *。(配置| XML)。生產

哈德森刪除初始文件併爲正確的環境部署正確的文件(目前僅限於證書)。

這允許開發人員獨立編寫和開發生產,證書和開發級別的配置文件,並在SVN中單獨進行版本管理。

+0

所以,我也學習了關於https://hudson.dev.java.net/的方式。謝謝! – doppelfish 2009-02-10 21:20:57

0

對於每個配置文件x,創建一個名爲x.dist的簽入文件,該文件是默認的分佈式配置。開發人員簽出後,請創建一個腳本,將每個x.dist文件複製到x,然後根據需要自定義x。可以重新運行此腳本以在重大更改之後更新文件,或者開發人員可以手動合併其更改。

對於部署,您可以檢入實時部署文件並讓啓動腳本明確引用它們(例如--config x.production)。

例如,在使用此方法時,如何分配Wordpress(您必須複製模板wp-config.php文件),或者在使用autoconf的開發項目中(其中configure.ac已簽入但配置文件必須由每個開發人員生成;一個特殊的配置文件將在發佈時間內發佈到tarball中)。

1

我認爲接受的答案是好的,但根據您的要求,它可能會有侷限性。

我們使用以下方法。請注意,我們是使用VS的.NET商店,並使用MSBuild(內置,社區和自定義)任務。

  • App.config被版本控制忽略但包含在項目中。
  • App.default.config受版本控制,也包含在項目中。而不是對可能改變的事物進行硬編碼,例如數據庫連接字符串,我們使用令牌。

一個項目的BeforeBuild任務查找的App.config的存及其如果沒有找到副本App.default.config的App.config。另外,如果構建服務器存在於CI構建上(確保乾淨配置),則它始終刪除App.config。然後,我們使用MSBuild Community FileUpdate任務,根據構建項目的任何內容,使用適當的值替換標記。

例如,新鮮的顯影液結賬可以爲本地數據庫設置數據庫連接字符串,每晚構建可以設置爲夜間DB等

0

接受的答案是好的。然而,你可以做你想做的事情(4年前),並且只保留一個配置文件,該配置文件檢出並且永不檢入 - 如果你的版本控制系統具有變更列表的概念。我在Perforce公司做到了這一點:

退房的配置文件並將其保存在自己的修改列表。當你提交時,只提交其他更改列表;這很容易記住,如果你命名你的配置文件changelist像「不要提交」。

該系統的一個優點是,如果別人修改配置文件的生產版本 - 即哪個服務器上存在的一個,和每個人都保持的修改本地版本 - 那麼您將會收到通知當您從服務器獲取配置文件時可能發生衝突。使用接受答案中提供的解決方案時,您可能會默默地使用本地設置覆蓋新的生產設置,這可能會破壞本地構建或導致您在下次提交時破壞構建。