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

时间:2013-03-12 22:25:26

标签: c# github open-source projects-and-solutions

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

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

3 个答案:

答案 0 :(得分:5)

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

有关符号源和nuget的更多信息,另请参阅: Creating and Publishing a Symbol Package。 要启用符号源调试,请参阅http://www.symbolsource.org/Public/Home/VisualStudio

您还必须记得启用Nuget package restore

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

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

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

  1. 向解决方案添加一个名为Class Library的唯一名称的新ClassLibrary1项目

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

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

    del "$(TargetPath)"
    
  5. 重复步骤1到3,但是给ClassLibrary2

  6. 的源路径提供了另一个名称,比如Output pathClassLibrary1
  7. 设置Project Dependancies的{​​{1}},查看ClassLibrary1

  8. 将所有其他项目添加为项目参考ClassLibrary2,将ClassLibrary2保留为默认值Copy Local

  9. 构建true一次,所有DLL现在都位于ClassLibrary2

  10. 的源路径中
  11. 将其添加到ClassLibrary1的引用中,并将ClassLibrary1保留为默认值Copy Local

  12. 设置应用程序的true以及所有其他不是循环依赖的项目,请查看Project Dependancies

  13. 添加其他项目的引用,从DLL放入ClassLibrary1

  14. 的路径
  15. 将其他项目中所有这些添加的DLL的ClassLibrary1设置为Copy Local

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