【问题标题】:.Net Build server tests fail because a dependancy can't be found.Net Build 服务器测试失败,因为找不到依赖项
【发布时间】:2017-01-26 20:32:16
【问题描述】:

我正在为 .Net 应用程序构建 Jenkins 构建服务器。它基于 ASP.Net MVC 5,并通过 NUnit 进行测试。

我的一个测试项目在构建服务器上的所有测试都出错。

1) 设置错误:project.Test.Area.Test_Name

SetUp : System.IO.FileLoadException : 无法加载文件或程序集 'System.Web.Mvc, Version=5.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。 (HRESULT 异常:0x80131040)

在 project.Test..Area.SetUp()

我所有的项目和测试项目都引用 System.Web.Mvc 5.2.3.0,而测试项目甚至没有使用 System.Web.Mvc 命名空间。 System.Web.Mvc 命名空间设置为复制本地,并包含在 NuGet 包管理器中。

我假设它可能是另一个依赖项,它本身依赖于 MVC 5.1.0.0,但由于我的项目不依赖于该版本,Jenkins 没有理由获取它,而我的本地系统已经从其他项目中获取它.

各种 app.config 和 web.config 文件也都为 MVC 指定 5.2.3。

有没有办法找出导致问题的依赖项,还是我应该找到在构建服务器上安装 MVC 5.1.0.0 的方法?


编辑:我在 Mvc 5.1.2 中找到了对转换的引用

src\packages\Microsoft.AspNet.Mvc.5.1.2\Content\Web.config.install.xdt:

28        <dependentAssembly xdt:Transform="Insert">
29          <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35"  />
30:         <bindingRedirect oldVersion="1.0.0.0-5.1.0.0" newVersion="5.1.0.0" />
31        </dependentAssembly>
32      </assemblyBinding>

看起来该转换应该将旧的 5.1.0 版本转换为 5.1.2.0 并且只是没有更新它吗?

编辑 2:不,更改不会影响任何内容,而且我在项目中找不到引用 5.1.0 的其他任何地方。

【问题讨论】:

  • 您是否查看了构建服务器并确保 System.Web.Mvc.dll 在运行单元测试时位于正确的位置?
  • 构建服务器正确获取 System.Web.Mvc 5.2.3 和显然是 5.1.2 并将它们设置在 src\ 目录旁边的它自己的 lib\ 目录中。但是,这些是服务器上仅有的两个版本。似乎没有什么明确告诉 NuGet 安装 5.1.0,但似乎有些东西想要使用它。 5.2.3 也被复制到每个单独的项目文件夹中。

标签: asp.net asp.net-mvc jenkins msbuild msbuild-4.0


【解决方案1】:

无赖。一个人讨厌这种事情。我之前尝试过的事情:

  • Visual Studio 是否安装在构建机器上并且是 MVC 5,因此安装在一些愚蠢的地方,如 C:\Program Files\Reference Assemblies\Microsoft\Framework\ 或 C:\Program Files\MSBuild\Microsoft 或 C:\Program Files\Microsoft.NET 或特别是:

    C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET Web Stack 5

msbuild 可能在哪里找到它?或者

gacutil -l | grep Mvc

(这让我很惊讶:我在我的身上找到了 MVC 4)。

  • 能否在构建机器上从命令行手动运行 msbuild?如果是这样,您可以使用 /verbosity:stupidlyhigh 运行,对不起,我的意思是 /verbosity:detailed,并希望看到 msbuild 项目/目标文件中的 exact 行失败?

或者至少在运行 msbuild 之前从命令行确认依赖的程序集在您期望的位置?

  • 或者深入了解构建机器上包文件夹的实际内容,以确认 Microsoft.AspNet.Mvc 目录包含您期望的版本?

请注意,其他依赖于 MVC5 的软件包可能会从 NuGet 中提取其他版本,这使得最后复制到 bin 文件夹中的版本有点随机。您通常使用[web|app].config(s) 中的AssemblyBindingRedirect 来解决此问题。

  • 6 个月前是否有人将任何 dll 或 bin 目录或 NuGet 包目录检查到 TFS 中?在这种情况下,所有 dll 都将以只读方式检出,这意味着它们可能不会被构建或 Nuget 还原正确覆盖/更新。

【讨论】:

  • /verbosity:d[etailed] 选项帮助我确认我的怀疑是 PostalMVC5 包有问题。查看 github 上的源代码,.csproj 文件引用 MVC 5.1.0.0,而要求和其他 app.config 设置引用 MVC 5.1.2,导致 NuGet 拉取 5.1.2,然后库尝试读取 5.1.0。谢谢!
  • 万岁!我将修改我的答案以包括向下钻取 other
猜你喜欢
  • 2018-10-12
  • 2021-10-08
  • 1970-01-01
  • 2017-12-12
  • 2012-08-15
  • 2021-12-26
  • 1970-01-01
  • 2014-01-09
  • 2021-09-08
相关资源
最近更新 更多