应否将应用程序依赖的库存储在源代码管理中?我的一部分说应该,另一部分说不。添加一个20mb的库使整个应用程序相形见feel是错误的,这仅仅是因为您依赖于它的几个功能(尽管相当繁重)。您应该只存储jar / dll还是项目的分布式zip / tar?
别人在做什么?
Answers:
除了在您的存储库中拥有第三方库之外,值得这样做的方式还可以使其轻松跟踪和合并将来对库的更新(例如,安全修复程序等)。如果您正在使用Subversion,则使用适当的供应商分支是值得的。
如果您知道在修改第三方代码之前会是阴冷的一天,那么(如@Matt Sheppard所说)外部组件是有道理的,它为您带来了额外的好处,即可以很容易地切换到如果需要安全更新或必备的新功能,则应使用该库的最新版本。
此外,在更新代码库时,如果需要,可以省去长时间的缓慢加载过程,从而跳过外部。
@Stu Thompson提到了在源代码管理中存储文档等。在较大的项目中,我已经将整个“客户”文件夹存储在源代码管理中,包括发票/账单/会议记录/技术规格等。整个射击比赛。虽然,请记住将这些内容存储在一个单独的存储库中,该存储库将提供给您:其他开发人员;客户端; 您的“浏览器源代码视图” ...咳嗽... :)
存储从现在起10年后构建项目所需的一切。我存储所有库的整个zip发行版,以防万一
编辑2017年:这个答案年龄不大:-)。如果您仍在使用诸如ant或make之类的旧内容,上述内容仍然适用。如果您使用诸如maven或graddle之类的更现代的东西(例如,.net上的Nuget),并且具有依赖项管理,则除了版本控制服务器之外,还应该运行依赖项管理服务器。只要两者都有良好的备份,并且依赖性管理服务器不删除旧的依赖性,就可以了。有关依赖关系管理服务器的示例,请参见例如Sonatype Nexus或JFrog Artifcatory等。
永远不要将您的第三方二进制文件存储在源代码管理中。源代码控制系统是支持并发文件共享,并行工作,合并工作和更改历史记录的平台。源代码管理不是二进制文件的FTP站点。第三方程序集不是源代码;每个SDLC可能会更改两次。能够清理工作区,从源代码管理中提取所有内容并进行构建的愿望并不意味着需要将第三方程序集卡在源代码管理中。您可以使用构建脚本来控制从分发服务器提取第三者程序集。如果您担心控制应用程序的哪个分支/版本使用特定的第三方组件,那么也可以通过构建脚本来控制它。人们已经提到Maven for Java,并且您可以使用MSBuild for .Net进行类似的操作。
我通常将它们存储在存储库中,但是我很同情您希望减小尺寸的想法。
如果您不将它们存储在存储库中,则绝对需要以某种方式对其进行存档和版本控制,并且您的构建系统需要知道如何获取它们。Java世界中的许多人似乎都在使用Maven自动获取依赖项,但是我没有用过,所以我不能真正推荐或反对它。
一个好的选择可能是保留第三方系统的独立存储库。如果您使用Subversion,则可以使用Subversion的外部支持自动从另一个存储库中签出库。否则,我建议保留一个内部匿名FTP(或类似)服务器,您的构建系统可以自动从中获取需求。显然,您将要确保保留所有旧版本的库,并将所有内容与存储库一起备份。
我的偏好是将第三方库存储在依赖项存储库中(Artifactory和Maven例如,)中,而不是将其保留在Subversion中。
由于第三方库没有像源代码那样进行管理或版本控制,因此将它们混合在一起没有任何意义。远程开发人员还欣赏不必从慢速WPN链接下载大型库的情况,因为他们可以从任意数量的公共存储库中更轻松地获取大型库。
在以前的雇主中,我们将在源代码管理中构建应用程序所需的一切都存储了。旋转新的构建机器是与源代码控制同步并安装必要的软件的问题。
您必须存储构建项目所需的一切。此外,您的代码的不同版本可能对第三方有不同的依赖性。您需要将代码及其第三方依赖项分支到维护版本中...
就我个人而言,我已经做过并且到目前为止一直很满意的结果是将库存储在一个单独的存储库中,然后通过使用Subversion svn:externals功能链接到我在其他存储库中需要的每个库。这很好用,因为我可以将大多数库(主要是托管的.NET程序集)的版本副本保留在源代码控制中,而又不会增加我们主要源代码存储库的大小。以这种方式将程序集存储在资源库中,可以使构建服务器无需安装即可进行构建。我要说的是,在没有安装Visual Studio的情况下使构建成功是一件很麻烦的事情,但是现在我们可以正常工作了,对此我们感到满意。
请注意,我们目前不使用许多商业第三方控制套件或类似的东西,因此我们没有遇到许可问题,在这些问题上可能需要在构建服务器上实际安装SDK,但我可以看到在哪里很容易成为问题。不幸的是,我没有解决方案,当我第一次遇到它时,我会计划解决它。