1

我有一个场景,需要根据应用程序当前所在的位置在我的应用程序的 web.config 文件中更改数据库/连接字符串。也就是说,我的 Dev Web 服务器应该连接到我的 Dev 数据库。这同样适用于我的测试和生产环境。通过一些研究,似乎web.config 转换正是我正在寻找的,但有一个潜在的问题。

我工作的公司使用自制方法来部署生产应用程序。它所做的是将文件(用户选择或计算的差异)从测试环境复制到生产环境。使用 web.config 转换仍然有效吗?

如果我要部署到 Test,然后使用我们的工具“部署”到 Prod,web.config 文件的测试版本会被复制过来,对吗?这是假设在构建期间应用了转换。

我想可以将 Prod 版本部署到 Test,然后在 Prod 部署后将其替换为正确的版本,但这似乎很混乱。我对转换的工作方式有误解吗?什么是解决这个奇怪问题的聪明方法?

4

2 回答 2

3

使用 web.config 转换仍然有效吗?

不,当您在 Visual Studio 或 MSBuild 中使用发布功能时,会执行转换。在给定环境中部署应用程序的预编译版本后(假设您使用了发布功能),其他转换将丢失并且不会部署到此环境。因此,如果您使用一些自制工具从 TEST 复制到 LIVE,您将无法利用这些转换。为此,您需要使用 LIVE 环境重新发布您的应用程序。

于 2013-02-21T21:03:49.273 回答
0

@Jeff - 我一直在处理同样的情况,我们的问题是我们不想每次从一个环境迁移到另一个环境时都重新编译应用程序。这是 Web 转换的一个问题(重新编译代码!)。

我们在 MSI 中打包了基础 web.config 以及转换文件。所以我们打包了 web.config、web.config.DEV、web.config.Prod 等。然后在安装 MSI 之后,我更新了我们古老的部署脚本以调用一个 MSBUILD 脚本,该脚本在 PROD 服务器上进行转换。

我的 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>

于 2013-07-23T15:38:57.107 回答