一个开源项目将如何处理外部依赖关系?


23

当一个人编写一个开源项目并使用Google Code或GitHub,并想使用Lua之类的库时,应该怎么做?

  • 应该在存储库中包含依赖项吗?
  • 应该从与项目其余部分相同的构建脚本中构建依赖关系,还是从单独的构建脚本中构建依赖关系?

鉴于该库在编译之前不需要安装。

Answers:


10

我强烈建议您阅读有关子模块的Git文档;假设您所有的源都使用Git,它就解决了这个问题。如果没有,您可以随时设置一个git repo以进行集成。这项工作是微不足道的,而且回报是巨大的。


1
在Common和Git中,子模块对依赖关系管理的实现比较薄弱。至少git子树是更好的迭代方式
Lazy Badger 2013年

4
-1请在您的答案中包括链接的详细信息,否则,当链接消失时,答案是无用的-与现在一样。不幸的是,我还没有投票的代表
Precastic

@Precastic:如果您搜索链接文本,它将直接带您到新页面;我不确定这能提供多少信息。
布莱恩·阿吉

1
请阅读stackoverflow.com/help/how-to-answer-特别是标题为“提供链接上下文”的部分(引用:“始终引用重要链接中最相关的部分,以防目标站点无法访问或永久离线) 。“)
预制2014年

17

应该在存储库中包含依赖项吗?

我认为依赖项应始终包含在存储库中,只要包含它们不违反任何使用条款即可。除了可以在进行构建之前手动找到正确的依赖项的正确版本之外,没有什么比这更令人烦恼了。当然,如果您有自动化的工具可以轻松地做到这一点,可以找到并下载正确的依赖项,那么这很容易,但是如果您当前未连接到网络或者服务器关闭或依赖项的项目,该怎么办?已经完全停产并脱机了吗?如果可能,请始终包括依赖项。

应该从与项目其余部分相同的构建脚本中构建依赖关系,还是从单独的构建脚本中构建依赖关系?

除非有充分的理由从源代码进行编译,否则请使用预编译版本。

为什么不在构建脚本中提供选项?一个简单的开关,用于选择是否还应该编译依赖项。如果用户也选择编译依赖关系,则只需从产品的构建脚本中调用他们自己的构建脚本。因此,用户可以手动调用依赖关系的构建脚本,也可以选择创建所有内容的完整构建。但是,如果没有充分的理由从源代码进行编译,我只是将依赖项作为二进制文件提供。我认为在开放源代码世界中,有些许可证要求您将源代码与产品一起分发,但这并不意味着您无法对其进行预编译。

简而言之:尽可能提供一个完整的独立工作包。这将为您的用户提供最大的便利。


1
@tdammers:我知道,如果您在Linux系统上安装软件,则程序包管理器会为您完成所有工作。但这需要Internet连接,并且程序包必须采用某种格式,我明确指出自动化工具可以帮助实现这一目标。例如,您不能将此类系统用于.NET开源工具。如果您查看诸如NHibernate或Castle Windsor之类的sourceforge工具,那么您会发现所有依赖项都包含为二进制文件。那是唯一合理的事情。
猎鹰

1
@tdammers:巧合的是,今天我必须在Linux机器上安装OpenOffice SDK。由于无法通过包管理器安装SDK,因此我从网站上获取了RPM。您认为尝试运行“ rpm --install”时收到的第一条消息是什么?错误:依赖项失败:ooobasis3.3-sdk-3.3.0-9567.x86_64需要ooobasis3.3-core01-哦,乐意
猎鹰

2
@tdammers:您是对的,但是在这种情况下,如果仅易于设置和安装,我希望拥有这种冗​​余。当您想查看依赖地狱时,请查看/ usr / lib目录。一切都有:冗余,颠覆,甚至您都不知道哪个程序使用哪个库。当然,让包裹经理来处理!但是,如果程序包管理器无法像我提到的开放办公室一样处理它,该怎么办?从根本上讲,这意味着您已精疲力尽,并且很难安装某些东西。
猎鹰

2
@tdammers:以及我对此的更多思考和经验:我什至无法计算仅由于依赖项失败或某些程序拒绝运行而不得不在此目录中创建符号链接的时间,即使通过软件包管理器进行安装也是如此。也许现在情况已经好转了,但是要使某些事情运转起来仍然常常是艰苦的工作。如果只是将依赖关系与应用程序一起提供,则可以避免这些问题。为了避免这种麻烦,我很乐意支付几MB的额外空间。
猎鹰

2
@tdammers:Web上有关如何在特定linux系统上安装特定程序的无数教程就是这个问题的见证。
猎鹰

3

这可能适用于您的用例,也可能不适用于您的用例,但是我们在工作中要做的是在每个分支中都包含一个“ References”文件夹。我们在这里放置第三方DLL。这会导致源代码控制中相对不变的二进制文件大量重复,但是存储成本低廉,并且每个分支和标签在任何时候都具有其期望的依赖项(和版本!)。

我们自己预先编译依赖项,然后将已编译的二进制文件移到该文件夹​​中。我们自己的内部共享库也采用这种方式。这样,相同的技术就可以用于预编译的专有库,开源库和内部库。


至于现在我已经重新阅读了,实际上回答了您的问题,做了同样的事情,仅提及您的项目使用了预编译的1.3.5版本的Lua。


1

应该在存储库中包含依赖项吗?

如果此依赖关系是产品不可分割的一部分(源依赖关系),而不是二进制依赖关系,则可以在存储库中引用该引用(通过任何可用于SCM方法的引用),可以单独解决该依赖关系

应该从与项目其余部分相同的构建脚本中构建依赖关系,还是从单独的构建脚本中构建依赖关系?

没关系。您可以根据自己的需求(速度/透明度/可管理性等)选择任何一种方法


0

作为Eclipse商店,我们刚刚开始使用Buckminster来管理我们的构建/组装/部署过程。

我们的第一步是拔出所有现有的依赖库,让buckminster负责实现正确的库。这使得部署更快,更小。

下一步将把我们的整体svn存储库移至一系列模块化git存储库。

我不知道buckminster与git子模块(或针对此问题的Mercurial子仓库)集成的程度如何,但是很高兴buckminster对于任何给定组件所使用的VCS都是不可知的。

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.