如何使用开源依赖项组织开源Visual Studio项目?

我已经开始使用一些其他开源项目作为依赖项的开源MVC4项目。 我已经分叉了另一个项目,并将根据我的需要进行修改。 我面临的问题是如何保持这些项目相互依赖,但需要单独维护。 然而,git拉动我的项目的人也会得到依赖项目吗?

  1. 我可以将来自其他项目的所有相关代码抨击到我的存储库中,但是这样我就无法为依赖项目的分支做出贡献。 我将成为我的存储库的一部分。 不是真的想那样做。
  2. 我可以完全单独维护其他项目,并将* .dll文件复制到我的项目中。 并将依赖的dll文件提交到git中。 这很好,但是我没有同时开发两个项目的能力,同时在调试时踩到相关代码(好吧,如果复制* .pdb文件也可能不行)
  3. 与第2点类似,我可以从依赖项目构建nuget包并将它们添加到我的主项目中 – 再次,不能真正同时开发这两个项目,需要切换上下文。
  4. 有一些魔术有一个解决方案文件,它结合了我的存储库和依赖存储库中的项目。 在每个构建中,将依赖的dll文件复制到/ lib文件夹并提交它们。 这样我就不需要在单独的项目之间切换上下文。 但缺点是当其他贡献者git拉我的项目时,他们没有得到依赖项目,并且解决方案文件可能会被破坏,因为它将引用不在repo中的项目。

在这种情况下,您如何组织代码?

通常我会将nuget用于所有依赖项。 当我分叉一个项目时,我将它部署在nuget和符号源上 。 通过这种方式,您可以毫无问题地进入依赖关系源。

有关符号源和nuget的更多信息,另请参阅: 创建和发布符号包 。 要启用符号源调试,请参阅http://www.symbolsource.org/Public/Home/VisualStudio 。

您还必须记住启用Nuget包还原 。

使用此解决方案,您无法修改源代码,但至少可以调试它。

我在概念上使用类似于CMake的东西,但完全在Visual Studio中。 属性文件的function相对未知,可以包含在解决方案中。 这允许您创建仅包含依赖项路径的文件,包括可以使用的库并设置相对路径,然后要求人们为您不希望/不想包含的其他依赖项设置适当的路径。

通过一些工作,它相当干净,并且通过TeamCity和其他类似工具非常容易自动化(每个构建代理可以设置变量以指示它保持依赖的位置)。

对于小型依赖项和已经调整为与我的项目一起使用的依赖项,我将存档或松散文件保存在存储库中,并使用属性文件来引用它们。 其他人有关于在哪里找到它们以及如何编辑路径的说明。

如果您对这种方法感兴趣,我可以进一步了解一些细节。 需要花费一些工作才能弄明白,因为属性文件并没有很好地记录在案,但工作得非常整齐。

如果您没有创建循环依赖项 ,以下是一个想法:

  1. 向解决方案添加一个具有唯一名称的新Class Library项目,例如ClassLibrary1

  2. 在其项目设置的Build页面中,config Output path到应用程序输出路径

  3. Build Events页面中,将以下行添加到Post-build event command line块:

     del "$(TargetPath)" 
  4. 重复步骤1到3,但给出另一个名称,比如ClassLibrary2 ,并将Output path配置为ClassLibrary1的源路径

  5. 设置ClassLibrary1 Project Dependancies ,检查ClassLibrary2

  6. 将所有其他项目添加为ClassLibrary2 项目引用 ,将Copy Local保留为默认值true

  7. 构建ClassLibrary2一次,所有DLL现在都在ClassLibrary1的源路径中

  8. 将它们添加到ClassLibrary1引用中,并将Copy Local保留为默认值true

  9. 设置应用程序的Project Dependancies项和所有其他不导致循环依赖项的项目 ,请检查ClassLibrary1

  10. 从DLL放在ClassLibrary1的路径添加其他项目的引用

  11. 将其他项目中所有这些添加的DLL的Copy Local设置为false

因此,项目ClassLibrary1是解决方案的外部库的中央控件。 每次Rebuild Solution (或只是构建应用程序)时, ClassLibrary1复制最新的DLL添加到其对应用程序输出文件夹的引用,并删除它自己生成的名为ClassLibrary1.DLL的DLL。 编译时或运行时的应用程序和依赖项将使用相同版本的DLL,您无需执行额外的部署或检查每个部署。