【问题标题】:TFS Build 2012, ASP.NET MVC & MSB3247: Found conflicts between different versions of same dependent assemblyTFS Build 2012, ASP.NET MVC & MSB3247: 发现同一依赖程序集的不同版本之间存在冲突
【发布时间】: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


【解决方案1】:

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

首先,在安装 Visual Studio 2012 或开发人员工作站上不会出现此问题,这是一个红鲱鱼。虽然此问题始终在构建服务器(TFS 构建)上出现,但它也发生在工作站上,前提是遵循“批量清除所有”步骤,然后执行“构建”。

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

  • Microsoft.Bcl.Build.1.0.10

它修改了 web 应用程序项目文件,添加了以下 Import:

<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

【讨论】:

【解决方案2】:

我在任何我能看到的地方都没有 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 项目中包含了文化 = 参数。

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

【讨论】:

    猜你喜欢
    • 2010-12-24
    • 2013-05-22
    • 2010-09-06
    • 2014-06-26
    • 2018-12-07
    • 2014-01-25
    • 2014-09-06
    相关资源
    最近更新 更多