TFS Build 2012, ASP.NET MVC & MSB3247: 发现不同版本的相同依赖程序集之间的冲突。

4
当我在TFS Build 2012下构建Web项目(ASP.NET MVC4)时,出现了MSBuild警告“MSB3247:在同一相关程序集的不同版本之间发现冲突。”。
考虑使用app.config重定向程序集“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]以解决冲突并消除警告。
考虑使用app.config重定向程序集“WebGrease,Culture = neutral,PublicKeyToken = 31bf3856ad364e35”从版本“1.3.0.0” []到版本“1.5.2.14234” [XXXX \ packages \ WebGrease.1.5.2 \ lib \ WebGrease.dll]以解决冲突并消除警告。
考虑使用app.config重定向程序集“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>

这个警告是在本地开发者版中出现的,但不是每次都出现。

有趣的是,如果我向web项目添加一个app.config文件,并将程序集重定向放在那里(仍然保持在web.config文件中的原始重定向),那么警告就会消失,无论是在本地还是TFS Build中(在这里它经常出现)。

什么鬼?你有什么想法吗?


你在项目中使用不同版本的NuGet包吗?如果你将所有项目更新到最新版本或相同版本,那么你就不需要在配置文件中保留这些条目。 - suresh2
@suresh2 谢谢,我知道了。我确实拥有最新的NuGet软件包版本。问题不在于有不同的程序集引用版本,而在于bindingRedirects没有被执行。通常,bindingRedirects用于解决仍然兼容的程序集的不同引用版本的问题。例如,ASP.MVC优化软件包引用了早期版本的WebGrease,而不是当前最新版本。这不是问题-可以向后兼容。WebGrease的NuGet软件包应该创建一个程序集重定向,正如它应该做的那样。 - Jaans
2个回答

3

我终于成功地确定了这个错误的根本原因并识别出一些误导性信息。

首先,关于在哪里安装Visual Studio 2012或者是否发生在开发人员工作站上的问题都是误导性信息。虽然这个问题在构建服务器(TFS Build)上始终存在,但只要按照“批量清除所有”然后“构建”的步骤进行,它也会在工作站上发生。

其次,我现在可以确认造成MSB 3247警告的罪魁祸首是Microsoft BCL Build Nuget Package:

  • Microsoft.Bcl.Build.1.0.10

它修改了Web应用程序项目文件,添加了以下导入:

<Import Project="..\packages\Microsoft.Bcl.Build.1.0.10\tools\Microsoft.Bcl.Build.targets" Condition="Exists('..\packages\Microsoft.Bcl.Build.1.0.10\tools\Microsoft.Bcl.Build.targets')" />

<Target Name="EnsureBclBuildImported" BeforeTargets="BeforeBuild" Condition="'$(BclBuildImported)' == ''">
  <Error Condition="!Exists('..\packages\Microsoft.Bcl.Build.1.0.10\tools\Microsoft.Bcl.Build.targets')" Text="This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=317567." HelpKeyword="BCLBUILD2001" />
  <Error Condition="Exists('..\packages\Microsoft.Bcl.Build.1.0.10\tools\Microsoft.Bcl.Build.targets')" Text="The build restored NuGet packages. Build the project again to include these packages in the build. For more information, see http://go.microsoft.com/fwlink/?LinkID=317568." HelpKeyword="BCLBUILD2002" />
</Target>

如果我将其从项目文件中注释掉,本地工作站和TFS构建服务器上的问题就会消失。
不幸的是,我不知道注释上述内容的影响。我可以把它注释掉吗?会发生什么?
Microsoft.Bcl.Build NuGet包是项目的一部分,因为它被标记为Microsoft.Net.Http NuGet包的依赖项,而我们确实使用了这个NuGet包。早期版本的Microsoft.Net.Http NuGet包没有这个对Microsoft.Bcl和Microsoft.Bcl.Build包的依赖关系。
希望这能帮助到某些人。
PS:这里有一个相应的但目前没有帮助的论坛帖子:http://social.msdn.microsoft.com/Forums/vstudio/en-US/faa1b607-50bb-48e3-bd5d-76f4fc02ad4c/ms-build-gives-warning-msb3247-found-conflicts-between-different-versions-of-same-dependent?forum=msbuild

2
请在此处投票 https://aspnetoptimization.codeplex.com/workitem/119 以解决此类问题。 - Gheorghe Bulicanu

1

我看不到Bcl.Build的任何内容,这是我在2013 TFS构建服务器上遇到的确切错误。

我的警告看起来像这样:

C:\Program Files (x86)\MSBuild\12.0\bin\amd64\Microsoft.Common.CurrentVersion.targets (1635): 发现同一依赖程序集的不同版本之间存在冲突。在Visual Studio中,双击此警告(或选择它并按Enter)以解决冲突;否则,将以下绑定重定向添加到应用程序配置文件中的“运行时”节点:

我已经在我的Web.config中添加了这个,我在我的Web和API项目中都没有包含culture=参数。

很抱歉我没有任何答案可以给你,我只是完成了我的第一个构建,并且这是我收到的最后两个警告。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接