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

时间:2009-04-09 19:53:09

标签: version-control

如何在源代码管理中存储项目中使用的第三方库?

您何时在源代码管理中存储二进制文件?

您何时将代码存储在源代码管理中?

你会存两个吗?在什么情况下你会这样做?

(顺便说一下,我正在使用.NET,但这对于这个问题并不重要)

15 个答案:

答案 0 :(得分:9)

  • 如何: vendor branch 通常是一种不错的方法

  • 当(第三方):为了最大限度地减少参与的数量:您可以将这些库添加到单独的外部参照(如Maven)中,但这意味着您需要访问该额外的为您的每个环境提供参考(开发 - 整合 - 认证 - 预生产 - 生产)

  • 何时(代码):为了管理更改的复杂性,当您知道正在运行到生产环境中的当前版本的更新和修复时 new发展正在进行中。

  • 为什么(同时存储):对于 deployment 原因:您可以管理完整的配置(列表您需要的元素)在一个参考中并随时随地查询:

    • 开发(您查询开发和执行代码所需的内容,包括编译/执行所需的第三方)
    • 测试(集成,认证):您使用
    • 查询要更新测试工作区的精确标签
    • 生产:您确切地从一个来源确定生产的内容:您的SCM。

对于测试和生产环境,这也意味着您自己的产品(正在构建的打包结果)也应该进入您的SCM(仅限正式版本,而不是内部使用的中间版本) )。
如果其他项目依赖于您的产品,他们将针对存储在SCM中的打包版本构建自己的项目,而不是针对他们以某种方式重新编译的源代码。

为什么这很重要?
因为最终,在生产中运行的是打包版本的产品,而不是“源代码重新编译”。因此,重要的是使用产品的目标最终形式进行所有测试,并在SCM中明确存储和标记。


Martin Lazarhis answer

中提出了合理的观点
  

源控件称为“源”控件,因为它应该控制源。

虽然这在历史上可能是正确的,但是每个当前的RCS都已演变为SCM(Source Code Management),它不仅控制源,还管理对作为计算机文件存储的文档,程序和其他信息的更改。
然后可以存储二进制文件(甚至以二进制增量存储)

另外,允许其中一些SCM提出S“C”M功能(如Source Configuration Management)。
SCM(配置)不仅存储任何类型的“文件集”,而且还存储这些集合之间的关系(又名依赖关系),以便您查询一个文件集,并“拉”该集所依赖的所有其他交付(构建或部署或运行​​)

答案 1 :(得分:5)

  

如何在源代码管理中存储项目中使用的第三方库?

作为二元或源或两者。取决于图书馆。

  

您何时在源代码管理中存储二进制文件?

我们没有源或内部库的第三方库,我们没有对其进行任何更改,或者库太大而无法构建。

  

您何时将代码存储在源代码管理中?

说,我们使用内部库A,但已经修复了一些特定于产品X的错误。然后产品X的库将保留源并构建它。

  

你会存两个吗?在什么情况下你会这样做?

是的,所有最新的二进制文件都存储在源代码管理中。

所以树看起来像这样:

  

产品

 |-- src

 |-- build

 |-- lib

       |- 3rdparty

       |- internal
  

...

答案 2 :(得分:4)

假设您正在使用.Net:

我在项目和源代码管理中创建了一个“Libraries”文件夹,其中包含任何第三方程序集。

我的解决方案然后引用这些程序集,我的构建过程将该文件夹拉到我们的构建服务器。

从源代码控制中提取代码的任何人都应该能够编译代码而无需查找引用和程序集。

答案 3 :(得分:4)

源控件被称为“源”控件,因为它应该控制源..

在Java中,使用某些版本控制系统来存储源和其他资源(如配置XML文件或图片),而不是使用某些依赖管理工具(如Apache Maven),它将存储,下载和管理项目的依赖项,这是常见的模式。第三方图书馆。然后,当您重新安装操作系统时,Maven可以自动从中央存储库(或您自己的私有存储库)下载您的dependecies,并将它们存储在磁盘上的本地缓存中。您甚至不必知道缓存的位置:)

Maven也可以和其他语言一起使用,据我所知,.net和C / C ++的插件都可以使用,但是除了Java之外我还没有使用它。

答案 4 :(得分:3)

我没有在SC中放置第三方源或二进制文件。我的理由是,我不必更新SC只是为了更新库。我开始后悔这件事。当我不得不重新创建项目时,我发现自己四处寻找lib源而不是仅仅同步到SC。

答案 5 :(得分:2)

在最近的一个Java项目中,我转而使用Maven - 这非常好,因为它意味着我不需要在lib /目录中存储任何第三方jar。在编译时,maven会引入依赖关系。一个不错的副作用是罐子的文件名中有版本号。

答案 6 :(得分:1)

我的经验是创建一个“lib”文件夹并保留所有第三方二进制文件。如果可用,我将为这些第三方创建一个完全独立的源代码树。

有些地方可能会有所不同,如果您使用的是开源而非零售第三方,使用开源解决方案,我倾向于只将代码包含在我的项目中,而不是签入二进制文件。

答案 7 :(得分:1)

您无需在源代码管理存储库中存储第三方库。这些库(想想SDL,libcurl等)应始终在网上提供。
只是两个raccomandations:

  • 确保在您的代码中明确说明您应编译的库版本
  • 确保该特定版本始终可在网络上找到

答案 8 :(得分:1)

一般来说,我会粗略地做其他用户规定的内容。

在Subversion的情况下,我承认我不能在其他系统的情况下说明包含该功能,可以在其他地方维护的存储库中使用External链接。在结帐/导出中,您将获得源的完整副本,包括来自该外部存储库的更新代码。

对于PHP / JS开发,这对我来说特别好,因为没有关于存储二进制文件的问题。我将Zend Framework,Doctrine ORM和jQuery的外部保存在项目的/ lib /文件夹中。每次更新都会为我提供一个完整的,所有必要文件的更新副本,而无需将该存储库URL添加到svn属性。

答案 9 :(得分:1)

如果您正在使用git(我推荐),并且您拥有第三方库的源代码,那么将库存储在自己的git存储库中并将其作为子模块包含在内是一个很好的设置。

如果源库也使用git,那么你可以克隆它们的库并将其推送到你自己的服务器上,这样你就永远不会丢失它。

Git子模块允许您指定项目所需的库版本,这对于保持兼容性非常有用。

答案 10 :(得分:0)

从概念上讲,您至少需要存储二进制文件(如果使用C / C ++,则需要存储标题) 对于没有源的第三方库,这通常是唯一的方式。

如果您有源代码,则可以选择存储源代码并在构建过程中构建第三方库。

答案 11 :(得分:0)

您应该能够安装新的操作系统,从源代码管理中获取源代码,构建并运行。所以是的,你应该把它们放在源代码控制中。

答案 12 :(得分:0)

这取决于它们有多大。当二进制文件或安装程序太大时,它可能会对远程用户造成严重破坏。存储二进制文件和安装程序的好处是开发人员需要启动和运行的所有内容都在源代码管理中,并且版本是正确的。如果您有单独的安装位置,则版本可能会混乱。所以,一般来说,我喜欢在源代码控制中存储小型或中型二进制文件,但是我忽略了较大的二进制文件。

编辑:哦,我称之为“BinRef”:)

答案 13 :(得分:0)

您何时在源代码管理中存储二进制文件?

当我希望他们能够快速恢复到旧版本的应用程序时,我将二进制文件存储在源代码管理中。我有很多理由这样做,其中包括以下内容:

  • 并非总能在完全匹配生产的环境中进行应用程序测试。
  • 以前的程序员可能没有使用过源控件或者可能使用不正确。因此,很难确定您要更改的源代码是与用户正在使用的版本匹配的版本。

答案 14 :(得分:0)

关于源代码和编译库(很可能是独立的):

如果我不使用第三方组件(编译库)或提供源来构建内部软件组件,我只需将它们从架子上下载并按规定安装(可能包括编译,pl / sql代码)例)。我不会将它们安装在依赖管理仓库或任何源代码控制系统中,原因很简单,我不希望它们无意中包含在我正构建的组件中,或者我不希望在任何软件周期中跟踪它们。这是应该使用其他工具跟踪的资产(软件资产)。如果我不使用它们进行软件开发,我不会也不应该在用于软件开发的工具中看到它们。

如果我依赖它们来构建我自己的软件,我会整天存储它们。