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
, 只有当
ProjectProfileTransformFileName
和
ProjectConfigTransformFileName
相等时默认为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的原因是我的.sln文件中的ProjectConfigurationPlatforms不正确。.sln文件的Configuration|Platform对UAT|Any CPU被映射到该项目的Release|Any CPU。
我认为实际上它会应用UAT和Release转换(由于我的转换的确切性质以及它们被应用的顺序,这与应用UAT转换两次是无法区分的)。
更新解决方案文件中的ProjectConfigurationPlatforms映射解决了我的问题。