1

我正在尝试使用Jenkins中的NDbUnit设置我的 MVC4 应用程序的自动测试。在我的本地计算机上NDbUnit.coreNDbUnit.SqlClient我通过单击“引用”文件夹,然后单击“添加引用”,然后从磁盘添加它们,在解决方案资源管理器中添加了这些引用。他们的工作就像一个魅力。

但是,当我将解决方案提交到触发 Jenkins 构建服务器上的自动构建的存储库时,构建失败。两个文件的错误消息如下所示:

c:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(1605,5): warning MSB3245: 
Could not resolve this reference. Could not locate the assembly "NDbUnit.Core". Check to make 
sure the assembly exists on disk. If this reference is required by your code, you may get 
compilation errors. [C:\Program Files (x86)\Jenkins\jobs\Project\workspace\Project\Project.csproj]
      For SearchPath "{HintPathFromItem}".
      Considered "..\packages\NDbUnit_1.6.7.0\NDbUnit.Core.dll", but it didn't exist.

当我重新结帐并尝试在我自己的机器上构建解决方案时,我收到相同的消息,即无法解析引用。然而,这两个文件位于 References 文件夹中,它们只是不起作用(与其他文件不同,它们旁边有一个感叹号符号)。只有当我从我自己的机器上引用它们时,它们才能再次工作。

这种疯狂让我在持续集成游戏中损失了很多积分。我希望有人可以向我解释如何正确引用.dll's,以便它们在任何地方都可以工作。

4

1 回答 1

5

通常,您需要做两件事来确保程序集可用:

  1. 将二进制文件签入源代码管理。一些源代码控制系统一开始可能会推迟,因为它们是二进制格式,但您通常可以强制它。(我知道 TFS,如果你这样做tf add Foo.*,它会跳过 DLL,所以你需要tf add Foo.dll明确地做。)
  2. 确保您从正确的相对路径引用 DLL。这在项目文件中指定为 HintPath,例如

    <Reference Include="DllThatYouReference">
      <HintPath>../../relative/path/to/DllThatYouReference.dll</HintPath>
    </Reference>
    

手动执行此操作的替代方法是使用包管理器,例如Nuget。当您安装 Nuget 包时,它将在项目文件中为该引用配置 HintPath。如果它们尚不可用,您还可以将其配置为在构建时安装必要的包,这增加了一点编译时间,以换取不必签入 DLL 文件。

然而,这两个文件位于 References 文件夹中,它们只是不起作用(与其他文件不同,它们旁边有一个感叹号符号)。

References 文件夹实际上并不是一个文件夹,它是您的项目引用的所有程序集的列表。此信息是从项目文件中找到的,因此无论文件是否在本地存在,它们都会显示出来。感叹号表示文件丢失(或由于其他原因无法解析,但从您的错误消息来看,它们可能丢失了)。

于 2013-12-04T06:38:10.293 回答