2013-02-21 59 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>