2013-02-21 39 views
1

我有一個場景,其中數據庫/連接字符串需要在應用程序的web.config文件中進行更改,具體取決於應用程序當前所在的位置。也就是說,我的Dev Web服務器應該連接到我的開發數據庫。這同樣適用於我的測試和生產環境。通過一些研究,似乎web.config transformations正是我正在尋找的,但有一個潛在的問題。多個環境的Web.config轉換

我工作的公司使用自制方法來部署生產應用程序。它所做的是將測試環境中的文件(用戶選擇或計算差異)複製到產品環境。將使用web.config轉換仍然工作?

如果我要部署到測試,然後使用我們的工具「部署」到Prod,web.config文件的測試版本將被複制到右側?這是假設轉換在構建期間應用。

我想可以將Prod版本部署到Test中,然後在Prod部署後用適當的版本替換它,但這似乎很麻煩。我錯誤地轉變了工作方式嗎?這個奇怪的問題會是什麼聰明的解決方案?

回答

3

將使用web.config轉換仍然工作?

不,轉換是在Visual Studio或MSBuild中使用發佈功能時執行的。一旦在給定的環境中部署了應用程序的預編譯版本(假設您使用了發佈功能),則其他轉換將丟失並且不會部署到此環境中。因此,如果您使用一些自制工具從TEST複製到LIVE,您將無法利用這些轉換。爲此,您需要使用LIVE環境重新發布您的應用程序。

+0

我想這可能是一個問題。對於問題最後一段中提出的解決方案,您有什麼想法? – Jeff 2013-02-21 21:09:51

+0

我不太明白你在最後一段提出的建議。在Test上部署Prod轉換,然後做一些替換?這似乎是錯誤的。做到這一點的正確方法是有一個MSBuild任務,它可以爲正確的環境生成正確的包,然後將每個包部署到其目標環境中。但是由於您使用的是家庭構建工具,因此您可以執行以下操作:可以在每臺服務器的相應machine.config中定義連接字符串,然後使用您在每個環境中部署的完全相同的軟件包。 – 2013-02-21 21:12:44

+0

直觀的解決方案,但我沒有訪問machine.config。在我的公司,寫入生產服務器的唯一方法是使用此工具。我想出了一個非常簡單的解決方案。只需將適當的'web.config'文件轉換爲生產文件,而不再觸摸它。感謝您的幫助。這些信息對非工作項目很有用 – Jeff 2013-02-21 21:35:50

0

@Jeff - 我一直在處理同樣的情況,我們的問題是我們不想每次從一個環境遷移到另一個環境時重新編譯應用程序。這是網絡轉換的一個問題(重新編譯代碼!)。

我們打包了基礎web.config以及MSI中的轉換文件。因此,我們打包了web.config,web.config.DEV,web.config.Prod等。然後,在安裝MSI之後,我更新了舊的部署腳本,以調用在PROD服務器上進行轉換的MSBUILD腳本。

我的powershell腳本首先會找到以當前環境名稱(.DEV,.PROD等)結尾的所有配置文件。然後它會找到默認文件,如果是web.config.dev,它會嘗試找到web.config。之後它會將這些參數傳遞給MSBUILD並進行轉換。轉換後,輸出將保存在默認位置,稍後將複製回原始位置。

<UsingTask TaskName="TransformXml" 
      AssemblyFile="Microsoft.Web.Publishing.Tasks.dll"/> 

<PropertyGroup> 
    <FilePath></FilePath> 
    <ConfigFileName></ConfigFileName> 
    <TransformFileName></TransformFileName> 
    <OutputFileName></OutputFileName> 
    <StackTraceEnabled>False</StackTraceEnabled> 
</PropertyGroup> 


<Target Name="Transform"> 

    <Message Text="FilePath = $(FilePath)" /> 
    <Message Text="ConfigFileName = $(ConfigFileName)" /> 
    <Message Text="TransformFileName = $(TransformFileName)" /> 
    <Message Text="OutputFileName = $(OutputFileName)" /> 

    <TransformXml Source="$(FilePath)$(ConfigFileName)" 
        Transform="$(FilePath)$(TransformFileName)" 
        Destination="$(OutputFileName)" 
        StackTrace="$(StackTraceEnabled)" /> 
</Target>