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

时间:2015-07-21 15:01:58

标签: asp.net .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

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

PreTransformWebConfig
TransformWebConfigCore
PostTransformWebConfig
PreProfileTransformWebConfig

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

ProfileTransformWebConfigCore
PostProfileTransformWebConfig

3 个答案:

答案 0 :(得分:5)

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相等,则默认为false。

我在以下三个项目中添加了以下目标:

  <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的原因是我的ProjectConfigurationPlatforms文件中的.sln不正确。 .sln文件的UAT|Any CPU配置|平台对被映射到此项目的Release|Any CPU

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

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

答案 1 :(得分:0)

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

由于此配置,它正在运行多个web.config转换:

Configuration Manager

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

答案 2 :(得分:0)

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