Web.config 发布时变换 运行 两次

Web.config transform is running twice on publish

我有一个包含三个 Web 项目(以及许多 class 库项目)的解决方案。 Web 项目都使用 Web.config 转换来指定每个环境的配置。

我有多个构建配置文件的 Web.config 转换,名为 Web.UAT.config、Web.Staging.config 和 Web.Release.config

我正在使用带有以下参数的 MSBuild 从我的 CI 服务器构建和部署项目:

/t:Clean,Build /p:Configuration=UAT;DeployOnBuild=True;PublishProfile=UAT

对于三个项目中的一个项目,web.config 转换似乎应用了两次,标记为 xdt:Transform="Insert" 的元素出现了两次。查看构建输出,似乎所有三个项目 运行 以下目标:

PreTransformWebConfig
TransformWebConfigCore
PostTransformWebConfig
PreProfileTransformWebConfig

但有问题的项目也 运行 这些目标(紧接在上面列出的目标之后):

ProfileTransformWebConfigCore
PostProfileTransformWebConfig

Web 项目的 .csproj 文件默认包括以下内容:

<Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />

此文件依次导入 \Web\Microsoft.Web.Publishing.targets,也在 VSToolsPath 下(在我的开发机器上,这对应于 C:\Program Files (x86)\MSBuild\VisualStudio\v12.0)。

该文件中有趣的部分如下所示:

<ProjectProfileTransformFileName Condition="'$(ProjectProfileTransformFileName)'=='' And '$(PublishProfileName)' != '' ">$(_ProjectConfigFilePrefix).$(PublishProfileName)$(_ProjectConfigFileExtension)</ProjectProfileTransformFileName>

<!--if $(TransformWebConfigEnabled) is also enabled and the ConfigTransform and ProfileTransform happen to have same filename, we default $(ProfilefileTransformWebCofnigEnabled) to false so it doesn't do double transform-->
<ProfileTransformWebConfigEnabled Condition="'$(ProfileTransformWebConfigEnabled)'=='' And '$(TransformWebConfigEnabled)' == 'true' And ('$(ProjectProfileTransformFileName)' == '$(ProjectConfigTransformFileName)')">False</ProfileTransformWebConfigEnabled>

双重转换是 ProfileTransformWebConfigCore 运行 的结果,它以 ProfileTransformWebConfigEnabled 为条件,仅当 ProjectProfileTransformFileNameProjectConfigTransformFileName 相等。

我将以下目标添加到我的所有三个项目中:

  <Target Name="DebugWebConfigTransform" AfterTargets="PreProfileTransformWebConfig">
    <Message Text="ProjectProfileTransformFileName: $(ProjectProfileTransformFileName)"/>
    <Message Text="ProjectConfigTransformFileName: $(ProjectConfigTransformFileName)"/>
  </Target>

对于有问题的项目,此目标输出以下内容:

DebugWebConfigTransform:
  ProjectProfileTransformFileName: Web.UAT.config
  ProjectConfigTransformFileName: Web.Release.config

由于这两个值不同,因此由于上述原因发生了双重转换。

ProjectConfigTransformFilename 设置为 Web.Release.config 的原因是我的 .sln 文件中的 ProjectConfigurationPlatforms 不正确。 .sln 文件的配置|平台对 UAT|Any CPU 被映射到此项目的 Release|Any CPU

我认为它实际上是在应用 UAT 结果是发布转换(由于我的转换的确切性质和它们应用的顺序,这是无法区分的应用 UAT 转换两次)。

更新解决方案文件中的 ProjectConfigurationPlatforms 映射解决了我的问题。

我遇到这个问题是因为我的解决方案配置中有多个项目使用不同的配置。

由于此配置,它 运行 不止一次 web.config 转换:

切换项目以使用相同的配置后,我的 web.config 中不再收到问题。

如果您不使用 Configuration msbuild 参数,似乎也会发生这种情况。 PublishProfile 不够好。