如何为依赖项添加适当的引用,以便它可以在每个人的机器上运行(包括构建服务器)?

Erw*_*ers 1 ndbunit jenkins visual-studio-2012

我正在尝试使用Jenkins中的NDbUnit设置我的MVC4应用程序的自动测试.在我的本地机器我不得不引用NDbUnit.coreNDbUnit.SqlClient我在Solution Explorer中添加通过单击引用文件夹,然后点击"添加参考",然后从磁盘添加.他们的工作就像一个魅力.

但是,当我将解决方案提交到触发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.
Run Code Online (Sandbox Code Playgroud)

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

这种疯狂在持续整合游戏中花了我很多分.我希望有人可以向我解释我如何正确引用.dll它们以便它们可以在任何地方工作.

Jim*_*mmy 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>
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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