在源代码管理中存储第三方库


83

应否将应用程序依赖的库存储在源代码管理中?我的一部分说应该,另一部分说不。添加一个20mb的库使整个应用程序相形见feel是错误的,这仅仅是因为您依赖于它的几个功能(尽管相当繁重)。您应该只存储jar / dll还是项目的分布式zip / tar?

别人在做什么?

Answers:


28

除了在您的存储库中拥有第三方库之外,值得这样做的方式还可以使其轻松跟踪和合并将来对库的更新(例如,安全修复程序等)。如果您正在使用Subversion,则使用适当的供应商分支是值得的。

如果您知道在修改第三方代码之前会是阴冷的一天,那么(如@Matt Sheppard所说)外部组件是有道理的,它为您带来了额外的好处,即可以很容易地切换到如果需要安全更新或必备的新功能,则应使用该库的最新版本。

此外,在更新代码库时,如果需要,可以省去长时间的缓慢加载过程,从而跳过外部。

@Stu Thompson提到了在源代码管理中存储文档等。在较大的项目中,我已经将整个“客户”文件夹存储在源代码管理中,包括发票/账单/会议记录/技术规格等。整个射击比赛。虽然,请记住将这些内容存储在一个单独的存储库中,该存储库将提供给您:其他开发人员;客户端; 您的“浏览器源代码视图” ...咳嗽... :)


3
何时需要通过安装程序在每个开发人员工作站上对第三方库进行许可,该怎么办?
jpierson

+1,但是像git或hg这样的分布式SC呢?PS:最好的SO头像图标....
slf 2010年

@slf本文中的两种在git中进行供应商分支的方法:happygiraffe.net/blog/2008/02/07/vendor-branches-in-git
MattCan 2011年

48

存储从现在起10年后构建项目所需的一切。我存储所有库的整个zip发行版,以防万一

编辑2017年:这个答案年龄不大:-)。如果您仍在使用诸如ant或make之类的旧内容,上述内容仍然适用。如果您使用诸如maven或graddle之类的更现代的东西(例如,.net上的Nuget),并且具有依赖项管理,则除了版本控制服务器之外,还应该运行依赖项管理服务器。只要两者都有良好的备份,并且依赖性管理服务器不删除旧的依赖性,就可以了。有关依赖关系管理服务器的示例,请参见例如Sonatype NexusJFrog Artifcatory等。


18
包括Eclipse或Visual Studio在内吗?
jpierson

2
没有。不知道vs,但是我不需要蚀来构建项目,只需正确的JDK。最近使用Hudson / Jenkins或其他CI解决方案实施起来要容易得多。每个项目每个月都会自动生成一次,无论它有多旧...
Tony BenBrahim 2011年

1
所以问题仍然存在,您是否也将JDK存储在源代码控制存储库中?您在哪里划界线?
jpierson 2011年

5
@jperson,习惯了。使用自动定期构建,只要它在当前JDK上构建/通过测试,我就不需要原始的JDK。我在“自动构建系统是否仍可以每月构建此项目”
一词上划清界线

20

不要存储库;它们并不是严格意义上的项目,在您的版本控制系统中毫无用处。但是,一定要使用Maven(或针对蚂蚁构建的Ivy)来跟踪项目使用的外部库的版本。您应该在组织中运行仓库的镜像(已备份),以确保始终将依赖项置于您的控制之下。这应该使您两全其美。项目外部的外部jar,但仍然可靠且可集中访问。


在某些罕见的用例中,您必须在没有Internet连接的地方构建SW,将其存储(即在“ git clone”之后将其本地可用)是必不可少的。您不想告诉客户损失了一天,因为您无法“在现场”构建软件。
基数

18

我们将库存储在源代码管理中,因为我们希望能够通过简单地签出源代码并运行构建脚本来构建项目。如果您无法获取最新信息并一步一步构建,那么以后您只会遇到问题。


13

永远不要将您的第三方二进制文件存储在源代码管理中。源代码控制系统是支持并发文件共享,并行工作,合并工作和更改历史记录的平台。源代码管理不是二进制文件的FTP站点。第三方程序集不是源代码;每个SDLC可能会更改两次。能够清理工作区,从源代码管理中提取所有内容并进行构建的愿望并不意味着需要将第三方程序集卡在源代码管理中。您可以使用构建脚本来控制从分发服务器提取第三者程序集。如果您担心控制应用程序的哪个分支/版本使用特定的第三方组件,那么也可以通过构建脚本来控制它。人们已经提到Maven for Java,并且您可以使用MSBuild for .Net进行类似的操作。


永不说永不-请参阅上面的评论。尽管我很乐意寻求更好的解决方案。
基数

有些组织的代码是20到30年前编写的,使用了大量的怪异东西,这些东西在Internet上不再可用。我建议,如果您需要构建旧的源代码,那么最好的办法是提供不容易获得的任何内容。谁知道您的Maven程序是否会在20年后生效。我在现实生活中遇到过这种情况。
AminM

8

我通常将它们存储在存储库中,但是我很同情您希望减小尺寸的想法。

如果您不将它们存储在存储库中,则绝对需要以某种方式对其进行存档和版本控制,并且您的构建系统需要知道如何获取它们。Java世界中的许多人似乎都在使用Maven自动获取依赖项,但是我没有用过,所以我不能真正推荐或反对它。

一个好的选择可能是保留第三方系统的独立存储库。如果您使用Subversion,则可以使用Subversion的外部支持自动从另一个存储库中签出库。否则,我建议保留一个内部匿名FTP(或类似)服务器,您的构建系统可以自动从中获取需求。显然,您将要确保保留所有旧版本的库,并将所有内容与存储库一起备份。


喜欢单独的存储库想法。解决了远程用户只能访问源代码控制的问题(即,他们无法访问匿名FTP或其他任何您放置了第三方的东西)。我承认在源代码管理中拥有巨大且不变的二进制文件有点不对劲,但这至少可以将它们隔离到一个单独的仓库中。
仔细考虑

5

我所拥有的是一个内部Maven式的存储库,其中存储了所有第三方库(不仅是库,还包括它们各自的源代码分布以及文档,Javadoc和所有内容)。原因如下:

  1. 为什么将未更改的文件存储到专门设计用于管理已更改文件的系统中?
  2. 大大加快了退房时间
  3. 每次看到在源代码控制下存储的“ something.jar”时,我都会问“它是哪个版本?”

4

我将除JDK和IDE之外的所有内容都放入了源代码管理中。

托尼的哲学是正确的。不要忘记数据库创建脚本和数据结构更新脚本。在发布Wiki之前,我什至曾经将文档存储在源代码管理中。


4

我的偏好是将第三方库存储在依赖项存储库中(ArtifactoryMaven例如,)中,而不是将其保留在Subversion中。

由于第三方库没有像源代码那样进行管理或版本控制,因此将它们混合在一起没有任何意义。远程开发人员还欣赏不必从慢速WPN链接下载大型库的情况,因为他们可以从任意数量的公共存储库中更轻松地获取大型库。


2

在以前的雇主中,我们将在源代码管理中构建应用程序所需的一切都存储了。旋转新的构建机器是与源代码控制同步并安装必要的软件的问题。


1
在我看来,“必要的软件”和“构建应用程序所需的一切”之间似乎存在一些灰色区域。编译应用程序不是必需的吗?同样,许多SDK和第三方库也需要在开发人员工作站上安装。我们通常会在哪里划定界限?通常应将第三方.NET库存储在源代码控制中的方式是如何将它们存储在GAC中?
jpierson

1

将第三方库存储在源代码管理中,以便在将代码签出到新的开发环境时可以使用它们。您可能在生成脚本中包含的任何“包含”或生成命令也应引用这些“本地”副本。

除了确保始终可以使用您依赖的第三方代码或库之外,这还意味着新开发人员加入团队后,代码(几乎)可以在新的PC或用户帐户上构建。


1

存储库!该存储库应该是随时构建项目所需要的快照。由于项目需要不同版本的外部库,因此您将需要更新/签入这些库的较新版本。这样,如果您必须修补较旧的发行版等,则将能够获得与旧快照配套的所有正确版本。


1

就我个人而言,我的项目中有一个依赖文件夹,并在其中存储引用的库。

当我从事许多不同的项目时,常常发现相互依赖的部分需要相同版本的库,因此我发现这样做使工作变得更轻松,这意味着更新到给定库的最新版本并不总是可行的。

在每个项目的编译时都使用所有依赖关系意味着在事情进展的几年后,我仍然可以构建项目的任何部分,而不必担心会破坏其他部分。升级到新版本的库只是替换文件并重建相关组件的情况,如果需要的话,管理起来并不难。

话虽如此,我发现我所引用的大多数库都是相对较小的,重约几百kb,很少更大,这对我来说,将它们放在源代码控制中就不再是问题。


1

使用git子项目,并从第3方库的主git存储库中引用,或者(如果没有)则为每个所需的库创建一个新的git存储库。没有任何理由将您限制在一个git存储库中,并且我不建议您将别人的项目仅用作自己的目录。


0

存储构建项目所需的一切,因此您无需执行任何操作即可检出并进行构建。

(而且,作为经历过痛苦的人-请保留一份副本,以安装控件并在开发平台上工作。我曾经得到一个可以构建的项目-但没有安装文件和reg键,您无法不会对第三方控件的布局进行任何更改。这是很有趣的重写)


0

您必须存储构建项目所需的一切。此外,您的代码的不同版本可能对第三方有不同的依赖性。您需要将代码及其第三方依赖项分支到维护版本中...


0

就我个人而言,我已经做过并且到目前为止一直很满意的结果是将库存储在一个单独的存储库中,然后通过使用Subversion svn:externals功能链接到我在其他存储库中需要的每个库。这很好用,因为我可以将大多数库(主要是托管的.NET程序集)的版本副本保留在源代码控制中,而又不会增加我们主要源代码存储库的大小。以这种方式将程序集存储在资源库中,可以使构建服务器无需安装即可进行构建。我要说的是,在没有安装Visual Studio的情况下使构建成功是一件很麻烦的事情,但是现在我们可以正常工作了,对此我们感到满意。

请注意,我们目前不使用许多商业第三方控制套件或类似的东西,因此我们没有遇到许可问题,在这些问题上可能需要在构建服务器上实际安装SDK,但我可以看到在哪里很容易成为问题。不幸的是,我没有解决方案,当我第一次遇到它时,我会计划解决它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.