13

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

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

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

4

3 回答 3

6

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

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

您还必须记住启用Nuget package restore

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

于 2013-03-13T11:41:50.093 回答
1

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

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

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

如果您对这种方法感兴趣,我可以更详细地介绍。需要做一些工作才能弄清楚,因为属性文件的文档记录不是很好,但工作得非常整齐。

于 2013-03-15T20:29:36.120 回答
0

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

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

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

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

    del "$(TargetPath)"
    
  4. 重复步骤 1 到 3,ClassLibrary2Output pathClassLibrary1

  5. 一组Project DependanciesClassLibrary1检查ClassLibrary2

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

  7. 构建ClassLibrary2一次,所有 DLL 现在都在ClassLibrary1

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

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

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

  11. Copy Local所有这些添加到其他项目中的 DLL 集合到false

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

于 2013-03-15T20:22:57.370 回答