簡體   English   中英

為每個生產環境發布帶有web.config的MVC應用程序

[英]Publish an MVC application with a web.config for each production environment

我有一個帶有DevStagingProduction環境的MVC應用程序。 開發和暫存基本上是一回事(相同的VM,IIS,DB等); 但是,生產托管在負載均衡器后面的4個VM上。 每個VM都有自己的DB。 例如,部署到VM1的實例與PROD1 DB,VM2-> PROD2等通信。

為了部署到Dev和Staging,我使用Debug / Release web.config轉換從VS2013到VM進行簡單的文件系統部署。 對於生產部署,SysAdmin會將在暫存中部署和測試的位復制到每個生產VM。 這是為了確保QA在分段中測試和驗證的內容是我們向生產推廣的內容 - 我不想在分段和生產之間進行另一次構建。 因此,我們的SysAdmin負責(使用DevOps指導)編輯Staging和Production之間的每個web.config。 這基本上包括將connectionString值從"Data Source=STAGINGDB"更改為"Data Source=PROD1" (以及PROD2,PROD3,PROD4)。

我最終想要的是當我發布到Staging時,我想使用標准的Release web.config轉換部署我的web.config; 但是,除了這個文件,我還要創建並刪除4個附加文件(web.config.PROD1,.PROD2等)。 這將允許我們創建忽略現有web.config的腳本(使用Staging設置)並復制/重命名相應的.PROD配置。

我能夠(有點)用MSBuild實現這個目的:

<Project ToolsVersion="12.0" DefaultTargets="Build">
    ...
    <Target Name="Build">
        <TransformXml Source="Web.config" Transform="Web.PROD1.config" Destination="Web.config.PROD1" />
        <TransformXml Source="Web.config" Transform="Web.PROD2.config" Destination="Web.config.PROD2" />
        ...
    </Target>
</Project>

這種方法的主要問題是我必須創建4個基本上冗余的解決方案配置來連接到Transform。 除了DB connectionString之外,每個設置都是相同的。 似乎應該有一種更有效的方式。

只需通過MSBuild調用適當的轉換,我可以在沒有解決方案配置的情況下執行單獨的轉換,例如:

<add name="connectionString" connectionString="PROD1" xdt:Transform="SetAttributes" xdt:Locator="Match(name)" />

我應該完全使用其他流程嗎? 如果我可以堅持下去,我寧願不使用第三方nuget解決方案。 我應該使用.wpp.targets文件嗎? XmlPoke?

我想要的工作流程

  1. 右鍵單擊我的MVC應用程序並選擇“發布”(文件系統)
  2. 讓Release轉換完成它們並生成web.config。 我有基本的配置。 Debug = Dev,Release = Staging。

WebConfigs

  1. 添加一個自定義步驟,生成另外4個web.config文件
  2. 將所有內容打包,然后發布到Staging服務器,所以我在VM上看到了這一點:

發布

我讀過的所有內容都讓我相信我應該編寫自定義的MSBuild步驟,但我不知道我應該做什么(或者如何)。 這是一些偽代碼:

<Project ToolsVersion="12.0" DefaultTargets="Build">
    ...
    <Target Name="Build">
        <TransformXml Source="Web.config" Transform="[Do-Basic-Transform-On-Conection-String]" Destination="Web.config.PROD1" />
        <TransformXml Source="Web.config" Transform="[Do-Basic-Transform-On-Conection-String]" Destination="Web.config.PROD2" />
        <IncludeFilesInPublish>
            <FileToInclude>Web.config.PROD1</FileToInclude>
            <FileToInclude>Web.config.PROD2</FileToInclude>
        </IncludeFilesInPublish>
    </Target>
</Project>
  • 沒有解決方案配置,我可以在這里內聯[Do-Basic-Transform-On-Connection-String]嗎? 我只會更改2個connectionString值。 如果我需要創建一個解決方案配置,那很好......我不認為這是完全必要的,特別是如果我可以內聯。 也許我錯了?
  • 我如何完成<IncludeFilesInPublish>位,以便在發布期間我所做的任何事情都被打包,因此我的暫存部署有我的候選發布代碼和web.configs可以進行促銷。

我認為你的問題有兩個:1) 如何將環境變量或參數(即PROD1)傳遞到我的xdt轉換文件中,所以我只需要使用一個轉換文件? 2) 如何讓MSBuild迭代一組已知的命名項目以產生由該集合中的每個項目區分的輸出?

對於第一部分,我斷言你的唯一原因可能是問這個是因為你說“我必須創建4個基本上冗余的解決方案配置來連接到變換”,所以如果你的變換把“PROD1”作為參數你理想情況下只需使用一個變換。 但是我不確定如果不創建自己的XmlTransform任務就可以做到這一點。 xdt轉換工具非常有限。 但是關於MSBuild的好處是,它足夠靈活,理論上你可以提出自己的轉換任務,擴展/子類或行為就像開箱即用。

using System;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
using Microsoft.Web.Publishing.Tasks;

namespace Thanks.IllWriteMyOwnTasks
{
    public class MyCustomTransformXml : TransformXml // no idea if you can do this
    {
        public override bool Execute()
        {
            // do stuff here, 
            // maybe declare parameters that you can pass down to base.Execute()
            return true;
        }
    }
}

..

<!--<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v11.0\Web\Microsoft.Web.Publishing.Tasks.dll" />-->
<UsingTask TaskName="MyCustomTransformXml" AssemblyFile="Thanks.IllWriteMyOwnTasks.dll" />

對於第二部分,我認為您可以使用ItemGroup。

<ItemGroup>
    <MyEnvironments Include="PROD1" />
    <MyEnvironments Include="PROD2" />
    <MyEnvironments Include="PROD3" />
    <MyEnvironments Include="PROD4" />
</ItemGroup>  
<Target Name="BeforeBuild">
    <TransformXml Source="Web.config" 
                  Transform="Web.%(MyEnvironments.Identity).config" 
                  Destination="Web.config.%(MyEnvironments.Identity)" />
</Target>

我沒有對此進行過測試,但我認為根據我在此處看到的內容,它將自動重復與此示例中迭代MyEnvironments相同的任務。

您可以在不添加新解決方案配置的情況下將額外的轉換文件添加到解決方案中,並按照您自己的示例運行轉換(目標除外。'Build'對我來說不起作用):

<Project ToolsVersion="12.0" DefaultTargets="Build">
    ...
    <Target Name="BeforeBuild">
        <TransformXml Source="Web.config" Transform="Web.PROD1.config" Destination="Web.config.PROD1" />
        <TransformXml Source="Web.config" Transform="Web.PROD2.config" Destination="Web.config.PROD2" />
        ...
    </Target>
</Project>

如果您只是更改連接字符串,則轉換文件將非常小:

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

添加上述內容並進行編譯后,您需要將新生成的Web.config.PRODX文件添加到您的解決方案中。 添加它們之后,只需打開每個文件的屬性,並確保其編譯操作設置為“內容”。 這意味着它們包含在您的部署中。

由於web.PRODX.config轉換文件不是解決方案配置的一部分,因此您可以將它們粘貼在文件夾中以減少混亂。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM