Web.config转换在发布时运行两次

hgc*_*ngs 6 .net asp.net msbuild

我有一个解决方案,包括三个Web项目(以及许多类库项目).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
Run Code Online (Sandbox Code Playgroud)

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

PreTransformWebConfig
TransformWebConfigCore
PostTransformWebConfig
PreProfileTransformWebConfig
Run Code Online (Sandbox Code Playgroud)

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

ProfileTransformWebConfigCore
PostProfileTransformWebConfig
Run Code Online (Sandbox Code Playgroud)

hgc*_*ngs 5

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

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

这个文件反过来导入\Web\Microsoft.Web.Publishing.targets,也在VSToolsPath下(在我的dev机器上,这对应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>
Run Code Online (Sandbox Code Playgroud)

双变换是由于ProfileTransformWebConfigCore运行而发生的,这是有条件的ProfileTransformWebConfigEnabled,如果ProjectProfileTransformFileNameProjectConfigTransformFileName相等则只默认为false .

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

  <Target Name="DebugWebConfigTransform" AfterTargets="PreProfileTransformWebConfig">
    <Message Text="ProjectProfileTransformFileName: $(ProjectProfileTransformFileName)"/>
    <Message Text="ProjectConfigTransformFileName: $(ProjectConfigTransformFileName)"/>
  </Target>
Run Code Online (Sandbox Code Playgroud)

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

DebugWebConfigTransform:
  ProjectProfileTransformFileName: Web.UAT.config
  ProjectConfigTransformFileName: Web.Release.config
Run Code Online (Sandbox Code Playgroud)

由于这两个值不同,出于上述原因发生了双变换.

ProjectConfigTransformFilename设置为Web.Release.config的原因是ProjectConfigurationPlatforms我的.sln文件中的错误.该.sln文件的配置|平台对UAT|Any CPU被映射到Release|Any CPU这个项目.

我认为它实际上是应用UAT Release变换(由于我的变换的确切性质和它们的应用顺序,这与应用UAT变换两次无法区分).

更新ProjectConfigurationPlatforms解决方案文件中的映射为我解决了这个问题.