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

时间:2013-09-23 02:27:10

标签: asp.net-mvc msbuild web-config app-config tfsbuild

我正在获取MS Build警告“MSB3247:在同一个依赖程序集的不同版本之间发现冲突。”在TFS Build 2012下构建Web项目(ASP.NET MVC4)时。

  

考虑从版本“2.0.0.0”[]到版本“4.0.0.0”[XXXX \ packages \ Microsoft.AspNet]将程序集“System.Web.Mvc,Culture = neutral,PublicKeyToken = 31bf3856ad364e35”的app.config重新映射。 Mvc.4.0.30506.0 \ lib \ net40 \ System.Web.Mvc.dll]解决冲突并摆脱警告。

     

考虑从版本“1.3.0.0”[]到版本“1.5.2.14234”[XXXX \ packages \ WebGrease.1.5.2 \ lib \]的程序集“WebGrease,Culture = neutral,PublicKeyToken = 31bf3856ad364e35”的app.config重新映射WebGrease.dll]解决冲突并摆脱警告。

     

考虑将版本“3.4.1.9004”[]的程序集“Antlr3.Runtime,Culture = neutral,PublicKeyToken = eb42632606e9261f”的app.config重新映射到版本“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 Build(始终如一地发生)。

WTF?有什么想法吗?

2 个答案:

答案 0 :(得分:3)

我终于设法找出了这个错误的根本原因并找出了一些红色鲱鱼。

首先,它是一个红色鲱鱼,在开发人员工作站上安装或未发生Visual Studio 2012的情况下不会发生此问题。虽然问题在构建服务器(TFS Build)上始终存在,但它也会在工作站上发生,前提是“Batch Clean All”,然后是“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包的依赖项。早期版本的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

答案 1 :(得分:1)

我在任何可以看到的地方都没有Bcl.Build,这就是我在2013 TFS构建服务器上遇到的确切错误。

我的警告如下:

  

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

在我的web和api项目中,我已经在web.config中减去了culture = param。

对不起,我没有给你任何答案,我刚刚完成了我的第一个版本,这是我得到的最后两个警告。