我可以在 C# ASP.NET MVC 项目的默认安装 Visual Studio 2013 中重新创建它。我注意到它是因为我开始过渡到 Visual Studio 2013,但我们的构建服务器仍在 Visual Studio 2012 上;在我的一次提交后,我们的设置项目失败了,因为我在我的机器上收集的多余配置文件没有在构建服务器上生成。
这似乎是以前版本的 MSBuild 4.0 / Visual Studio 2012 和新版本的 MSBuild 12.0 / Visual Studio 2013 的工作方式之间的差异。
在 Visual Studio 2013 中,$(ProjectConfigFileName) 属性初始化为Web.config[1],该属性被复制到$(AppConfig)[2],导致_CopyAppConfigFile 运行[3],导致不必要的配置文件被命名并复制到bin 目录。
在 Visual Studio 2012 中,过程类似,只是它的 Microsoft.WebApplication.targets 版本缺少 2013 版本中的这个部分:
<!-- Instruct ResolveAssemblyReferences in MS.Common.targets to generate suggested binding redirects. -->
<PropertyGroup>
<AutoUnifyAssemblyReferences>false</AutoUnifyAssemblyReferences>
<AppConfig Condition="'$(AppConfig)' == '' And Exists('$(ProjectConfigFileName)')">$(ProjectConfigFileName)</AppConfig>
</PropertyGroup>
关键是AppConfig 行。由于 2012 版本中缺少 AppConfig 引用,因此 _CopyAppConfigFile 无法在 Visual Studio 2012 下运行,从而导致预期的行为(即文件未被复制)。
在 Visual Studio 2013 中,他们似乎添加了这一行,以便构建过程可以通过在 Visual Studio 的错误列表中双击它们来为您修复绑定重定向。当微软添加这个时,似乎没有人注意到它导致生成一个额外的配置文件并将其复制到输出文件夹。所以在我看来,这似乎是 Visual Studio 2013 中新构建过程中的一个错误(但几乎是无害的,因为配置文件是多余的)。因为它与我的构建服务器上的 Visual Studio 2012 构建过程冲突,我添加了一个额外的构建后步骤来清除无关文件:
<Target Name="AfterBuild">
<Delete ContinueOnError="true" Files="$(TargetPath).config" />
</Target>
然后您会感觉更好,因为知道这不是您的特定项目或系统设置的问题,这只是 Visual Studio 2013 现在的工作方式。
上面提到的文件位置:
[1] C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v12.0\Web\Microsoft.Web.Publishing.targets
[2] C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v12.0\WebApplications\Microsoft.WebApplication.targets
[3] C:\Program Files (x86)\MSBuild\12.0\Bin\Microsoft.Common.CurrentVersion.targets