【发布时间】:2013-09-27 20:37:28
【问题描述】:
在 TFS Build 2012 下构建 Web 项目 (ASP.NET MVC4) 时,我收到 MS Build 警告 “MSB3247:发现同一依赖程序集的不同版本之间存在冲突。”
考虑将程序集“System.Web.Mvc, Culture=neutral, PublicKeyToken=31bf3856ad364e35”从版本“2.0.0.0”[] 重新映射到版本“4.0.0.0”[XXXX\packages\Microsoft.AspNet。 Mvc.4.0.30506.0\lib\net40\System.Web.Mvc.dll] 解决冲突,摆脱警告。
考虑将程序集“WebGrease,Culture=neutral,PublicKeyToken=31bf3856ad364e35”从版本“1.3.0.0”[] 重新映射到版本“1.5.2.14234”[XXXX\packages\WebGrease.1.5.2\lib\ WebGrease.dll] 来解决冲突并消除警告。
考虑将程序集“Antlr3.Runtime, Culture=neutral, PublicKeyToken=eb42632606e9261f”从版本“3.4.1.9004”[] 重新映射到版本“3.5.0.2”[XXXX\packages\Antlr.3.5.0.2\ lib\Antlr3.Runtime.dll] 解决冲突,摆脱警告。
我知道是哪些引用导致了这些问题,这不是问题所在。我在web.config 文件中有相关的绑定重定向,其中大部分是在引用相关包时由 NuGet 设置的。
问题是这是一个 Web 项目,就好像 MSBuild 忽略了 web.config 文件中的绑定重定向:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Antlr3.Runtime" publicKeyToken="eb42632606e9261f" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.5.0.2" newVersion="3.5.0.2" />
</dependentAssembly>
</assemblyBinding>
</runtime>
在本地开发者构建中确实会出现此警告,但并非每次都一致。
有趣的是,如果我将 app.config 文件添加到 Web 项目并将程序集重定向放置在其中(仍将原始重定向保留在 web.config 文件中),则警告会消失,无论是在本地还是使用 TFS构建(持续发生的地方。)。
WTF?有什么想法吗?
【问题讨论】:
-
您在项目中使用不同版本的 nu-get 包吗?如果您将所有项目更新到最新版本或相同版本,则不需要配置文件中的这些条目。
-
@suresh2 是的,谢谢,我知道。我确实有最新版本的 NuGet 包。问题不在于存在不同的程序集参考版本,问题在于绑定重定向没有得到尊重。 bindingRedirects 经常用于解决仍然兼容的程序集的不同程序集引用版本。例如。 ASP.MVC 优化包用于引用旧版本的 WebGrease,而不是当前最新版本。这不是问题 - 并且向后兼容。用于 WebGrease 的 NuGet 包包含应有的创建程序集重定向。
标签: asp.net-mvc msbuild web-config app-config tfsbuild