如何使用开源依赖项组织开源Visual Studio项目?
我已经开始使用一些其他开源项目作为依赖项的开源MVC4项目。 我已经分叉了另一个项目,并将根据我的需要进行修改。 我面临的问题是如何保持这些项目相互依赖,但需要单独维护。 然而,git拉动我的项目的人也会得到依赖项目吗?
- 我可以将来自其他项目的所有相关代码抨击到我的存储库中,但是这样我就无法为依赖项目的分支做出贡献。 我将成为我的存储库的一部分。 不是真的想那样做。
- 我可以完全单独维护其他项目,并将* .dll文件复制到我的项目中。 并将依赖的dll文件提交到git中。 这很好,但是我没有同时开发两个项目的能力,同时在调试时踩到相关代码(好吧,如果复制* .pdb文件也可能不行)
- 与第2点类似,我可以从依赖项目构建nuget包并将它们添加到我的主项目中 – 再次,不能真正同时开发这两个项目,需要切换上下文。
- 有一些魔术有一个解决方案文件,它结合了我的存储库和依赖存储库中的项目。 在每个构建中,将依赖的dll文件复制到/ lib文件夹并提交它们。 这样我就不需要在单独的项目之间切换上下文。 但缺点是当其他贡献者git拉我的项目时,他们没有得到依赖项目,并且解决方案文件可能会被破坏,因为它将引用不在repo中的项目。
在这种情况下,您如何组织代码?
通常我会将nuget用于所有依赖项。 当我分叉一个项目时,我将它部署在nuget和符号源上 。 通过这种方式,您可以毫无问题地进入依赖关系源。
有关符号源和nuget的更多信息,另请参阅: 创建和发布符号包 。 要启用符号源调试,请参阅http://www.symbolsource.org/Public/Home/VisualStudio 。
您还必须记住启用Nuget包还原 。
使用此解决方案,您无法修改源代码,但至少可以调试它。
我在概念上使用类似于CMake的东西,但完全在Visual Studio中。 属性文件的function相对未知,可以包含在解决方案中。 这允许您创建仅包含依赖项路径的文件,包括可以使用的库并设置相对路径,然后要求人们为您不希望/不想包含的其他依赖项设置适当的路径。
通过一些工作,它相当干净,并且通过TeamCity和其他类似工具非常容易自动化(每个构建代理可以设置变量以指示它保持依赖的位置)。
对于小型依赖项和已经调整为与我的项目一起使用的依赖项,我将存档或松散文件保存在存储库中,并使用属性文件来引用它们。 其他人有关于在哪里找到它们以及如何编辑路径的说明。
如果您对这种方法感兴趣,我可以进一步了解一些细节。 需要花费一些工作才能弄明白,因为属性文件并没有很好地记录在案,但工作得非常整齐。
如果您没有创建循环依赖项 ,以下是一个想法:
-
向解决方案添加一个具有唯一名称的新
Class Library
项目,例如ClassLibrary1
-
在其项目设置的
Build
页面中,configOutput path
到应用程序输出路径 -
在
Build Events
页面中,将以下行添加到Post-build event command line
块:del "$(TargetPath)"
-
重复步骤1到3,但给出另一个名称,比如
ClassLibrary2
,并将Output path
配置为ClassLibrary1
的源路径 -
设置
ClassLibrary1
Project Dependancies
,检查ClassLibrary2
-
将所有其他项目添加为
ClassLibrary2
项目引用 ,将Copy Local
保留为默认值true
-
构建
ClassLibrary2
一次,所有DLL现在都在ClassLibrary1
的源路径中 -
将它们添加到
ClassLibrary1
引用中,并将Copy Local
保留为默认值true
-
设置应用程序的
Project Dependancies
项和所有其他不导致循环依赖项的项目 ,请检查ClassLibrary1
-
从DLL放在
ClassLibrary1
的路径添加其他项目的引用 -
将其他项目中所有这些添加的DLL的
Copy Local
设置为false
因此,项目ClassLibrary1
是解决方案的外部库的中央控件。 每次Rebuild Solution
(或只是构建应用程序)时, ClassLibrary1
复制最新的DLL添加到其对应用程序输出文件夹的引用,并删除它自己生成的名为ClassLibrary1.DLL
的DLL。 编译时或运行时的应用程序和依赖项将使用相同版本的DLL,您无需执行额外的部署或检查每个部署。