.Net Build 服务器测试失败,因为找不到依赖项

.Net Build server tests fail because a dependancy can't be found

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

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

1) SetUp Error : project.Test.Area.Test_Name

SetUp : System.IO.FileLoadException : Could not load file or assembly 'System.Web.Mvc, Version=5.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

at 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 的其他地方。

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

  • 是 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 project/target 文件中看到 exact 行失败了吗?

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

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

请注意,其他依赖于 MVC5 的包可能会从 NuGet 中引入其他版本,这使得最后复制到 bin 文件夹的版本有点随机。您通常会在 [web|app].config(s).

中使用 AssemblyBindingRedirect 来解决此问题
  • 是否有人在 6 个月前将任何 dll 或 bin 目录或 NuGet 包目录检查到 TFS 中?在这种情况下,所有 dll 都将以只读方式签出,这意味着它们可能无法通过构建或 Nuget 恢复正确 overwritten/updated。