.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。
我正在为 .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。