Svn 在版本控制中开发和使用公共库的最佳实践?

Svn 在版本控制中开发和使用公共库的最佳实践?,svn,version-control,Svn,Version Control,我一直想知道在两个或多个项目中使用的积极开发的公共库应该如何存储在版本控制中。我认为它的处理方式可能与第三方库不同,因为内部库更有可能获得热修复程序,这些热修复程序应该分发给版本控制中的许多项目 它的二进制文件应该在更新时导入到使用它的项目中(非常像第三方库),还是可以将其源代码与项目一起签出?在Subversion或其他版本控制系统中是否可能引用其他版本控制路径 我现在在一个项目中工作,该项目中的公共库位于Subversion的其他位置(并在许多项目中使用),并与该项目一起签入,因此在该项目中

我一直想知道在两个或多个项目中使用的积极开发的公共库应该如何存储在版本控制中。我认为它的处理方式可能与第三方库不同,因为内部库更有可能获得热修复程序,这些热修复程序应该分发给版本控制中的许多项目

它的二进制文件应该在更新时导入到使用它的项目中(非常像第三方库),还是可以将其源代码与项目一起签出?在Subversion或其他版本控制系统中是否可能引用其他版本控制路径


我现在在一个项目中工作,该项目中的公共库位于Subversion的其他位置(并在许多项目中使用),并与该项目一起签入,因此在该项目中对它们所做的任何更改都不会反映在它们的“真实”存储库中。我将对此提出一些修改建议,但我想了解一下处理这些公共库的最佳实践是什么。

如果使用Subversion,我会使用,它允许您创建一个Subversion repo到另一个Subversion repo的依赖关系。

Subversion允许您引用其他路径,通过使用该财产

也就是说,通常您希望对项目的状态有更多的控制,而不仅仅是“获取共享库头中的任何内容”。在这种情况下,我建议将编译后的库二进制文件提交到使用它的每个其他项目中。这样,您就可以控制将库部署到每个客户端。

尽早且经常地将可重用的“子库”分离到单独的项目中

看看开源实践:大多数东西都是拼凑在一起的许多小项目

创建许多小项目

避免签入二进制文件。同样,遵循开源实践。将源代码保存在subversion中


构建二进制文件并将它们放在与源文件分开的“项目共享”目录中。

处理此问题的正确工具是。它最初是为Java开发的,可以用于任何现有的编程语言

Maven在您的计算机上创建一个存储库,所有模块都位于该存储库中。您还可以创建一个公共模块存储库,允许其他人从那里下载模块

每个模块都有一个自动解析(读取下载)的依赖项列表。在项目的构建阶段,一个适合您的编程语言插件将把所有依赖项放到特定的位置,使源代码能够看到它们


Maven是一个很好的多功能工具,但很难掌握,这只是一个缺点。

我们将SVN中常见库的代码保存在它们自己的项目文件夹中。我们还将二进制文件提交到另一个名为Dependencies的“项目”文件夹。我们使用svn:externals将所需的引用引入到项目中。

正如其他人已经提到的,这是一种很好的方法。通过它们,您可以引用存储库的其他部分(也可以引用其他存储库,FTM)。项目可以引用其他(库)项目的头或某个分支或标记。后两种方法有助于稳定,前一种方法用于随时了解图书馆的最新情况


我见过使用CVS(这里没有外部代码,所以它是在必须执行的脚本中签入的)和SVN的各种方案。在我现在工作的公司里,我们有不同的顶级项目文件夹和共享库。这些项目可以参考这些库。在项目的主干上,这些外部引用通常指向库的头,在标记和分支上,项目引用库的标记(有时是分支)

我甚至不明白这个问题。如果foo依赖libbar,为什么要将libbar的源代码保留在foo的VCS中?如果适用于该语言,可以链接libbar或导入bar模块。为什么您要混淆项目的源代码树?我的“你好,世界!”项目依赖于libc。我的“你好,多莉!”项目也是如此。两个项目都没有将libc源代码保留在其代码库中。这样做是疯狂的。为什么在这方面对待内部库与第三方库有任何不同?简言之,最佳实践是:不要这样做。如果库中有需要传播到项目的热修复程序,请使用动态链接

我很好奇为什么这是社区维基。我相信会有很多答案,但其中一个对你有用,而且会被接受,或者有人会发布一个链接,指向一套简单易懂的指导原则,然后被接受。我通常将接近主观的问题标记为社区维基。可能有十种同样好的方法可以做到这一点。定义的编程问题有明确的解决方案,我认为它们是适当的问题。@ Blixt,可以说,几乎每一次“最佳实践”的讨论都是主观的。在不可重复的实验中衡量方法成功与否的能力相当差。因此,最终,它几乎总是被一些人认为是最好的。@CPerkins:是的,这就是为什么我希望它成为一个社区wiki,因为它是人们的经验和建议的集合,而不是一个明确答案的列表。尽管一般来说应该避免主观性,但在这些情况下,几乎不可能避免主观性,这就是我们使用社区维基的目的+1,尽管我怀疑这在实践中是否可以用于其他语言。如果可以的话,是否存在与maven兼容的perl、python、ruby、php、c#等存储库?对于Git,它将是Git子模块。我已经开始分解一般项目,并使用
svn:externals
引用它们,而且效果非常好@布利克斯:太好了。注意,像checkin这样的命令不会递归到通过外部引用签出的文件夹中。至少他们没有这样做