为什么没有针对C和C ++的程序包管理系统?[关闭]


78

软件包管理系统存在一些编程语言:

这样的系统还有其他语言吗?C和C ++呢?(这是主要问题!)为什么没有适用于他们的系统?而不是创建包yumapt-get或其他一般的包管理系统更好?


3
Objective-C有Cocoapods(非常类似于红宝石和捆绑器)。奇怪的是C ++没有类似的东西。也许是因为C ++的同质性较差。苹果提供了更多标准的东西来重新构建软件包。在C ++中,几乎无法就使用哪种字符串类达成共识。
Erik Engheim 2013年

我只想指出,其他语言的软件包管理器并不完美。例如,在Ruby Gems中,可能经常会遇到一种不适用于特定操作系统(比Windows可能更多)的宝石,并且文档并未告诉您它不适用于该操作系统。
Travis Pessetto

Answers:


28

实际上,有些人(知名度很高)正在努力创建和建立一个名为Ryppl的系统。很难为C ++建立这样的系统,因为它没有一个可以控制它的播放器。-更新:不幸的是它被放弃了。

关于第二个问题,普通的软件包管理器(除了不是跨平台的)不能满足开发人员的特定需求。


2
哇,我想知道他们将如何抗击20年的“我们不需要包装经理!”
TheLQ 2012年

8
好吧,他们一举成名,我将给他们带来疑问的好处并窥视一下。毕竟,
助推器

2
@TheLQ-除了以前没有人提出过可行的解决方案之外,我认为没有其他可比之处。没有“我们不需要臭臭的软件包管理器”,没有“没有人给我看过任何有用的东西”。前者可能很难解决,但后者很简单:只提供一些实际上可以帮助开发人员完成工作的东西。
迈克尔·科恩

1
这个答案应该更新:1)Ryppl是一个死项目,即使它的网站也死了。2)最近出现了cpm之类的其他项目(无论商业与否),因此要获取C ++的程序包管理器需要做很多工作。3)我相信,只有使用该模块的语言并且其中一种工具能够最大程度地利用该语言,才会有赢家。
Klaim 2015年

2
@Klaim re:{直到模块使用该语言}据我所知,模块并不能使事情变得更容易,它只是#include命令的语法糖。它不会解决版本控制/下载/安装/兼容性/跨平台C ++问题的主要问题。
ruslo 2015年

17

我认为C甚至C ++的问题在于它们是更加异构的语言:即使这些语言是标准化的,仍然存在具有不同选项或不同支持功能集的不同编译器。例如,我记得在一个堆栈溢出问题上发布了一个有关C ++的问题,该示例在GCC / Linux上运行得非常好,有人立即发布了一个回答,说我的代码是非标准的。

如果拥有像问题中提到的那样的软件包系统,则意味着拥有所有通用操作系统上所有主要编译器统一支持的通用语言和库。例如,您不想下载C ++软件包并发现它无法在您的编译器X版本上编译,因为它是在另一个操作系统的编译器Y上开发的。

我可以想象一个基于make和configure脚本(通常在Linux,cygwin和其他Unix风格上找到)的系统可以工作。但是,Visual Studio用户为什么要采用它?如果启动基于Microsoft编译器(和库)的软件包系统,则同样有效。

C ++是一种快速发展的语言,其标准始终需要一段时间才能被所有编译器完全支持,这一事实并不能缓解该问题。


好吧,您可以编写可移植的C ++,也可以编写特定的工具链。您的选择,两者都没有错,尽管在对后者没有优势的情况下不做前者则有些次优。
Deduplicator

2
有可移植的C和C ++。如果无法通过安装程序轻松地独立安装库,则应重新制作。完全有可能做到这一点。即使在NodeJS中,许多模块都无法在Windows上构建,但是仍然设法存在,因此偶尔的构建问题也不成问题,并且具有集中式的程序包管理器可以简化用户的反馈并使其更有动力来处理问题。
德米特里

4

我认为,为了回答您的问题,我们需要提出的问题是“其他语言/生态系统从拥有自己的集中化软件包存储库中可以获得什么?” 和“这是否适用于C / C ++?”

我觉得第一个问题的答案与新语言的初步推广有关:早期采用者希望新来者尽可能容易地进入生态系统,获取有用的,经过测试的代码并回馈自己的语言。出于明显的原因,“使用图”始终只有一个根-语言的创建者。通常有一个参考实现(至少在最初是这样),因此您可能希望共享的任何代码都必须遵循该参考实现。

这使得创建仅下载和编译的软件包变得容易。当然,如果C或C ++在2013年推出,他们的社区可能会遵循类似的发展道路,但是他们没有,也没有一个流行的工具链可以应用程序包管理器。这使得这种程序的实施太麻烦了,不值得麻烦。(您应该让用户在libfoo-gcc和libfoo-vs之间进行选择吗?您让它由打包程序来解决吗?还是由构建过程来决定?如果是这样,那么与直接压缩包有什么不同?)

因此,总结我对第一个问题的回答,我认为创建软件包管理器的模式主要是用来推动采用

考虑到这一点,我认为很容易理解为什么没有单个系统能够满足这一需求-因为C和C ++程序员不存在这种需求。对于C和C ++社区(或实际上是任何程序员社区)真正构成问题的是最初隐含的需求:分发,保持最新并贡献代码。这已经由不同的人以不同程度的成功解决了很多次,实际上,一个系统正在获得可观的市场份额:git(以及之前的一些其他系统)。

基本上,当问题有所不同时,解决方案看起来也有所不同,但是恕我直言,键入gem installgit clone模拟之间的区别是没有意义的。


2
“其他语言/生态系统从拥有自己的集中式软件包存储库中可以获得什么?”。您需要成为一个非常有经验的开发人员,才能开始下载软件包并信任它们可以与您的软件一起正常工作。拥有软件包管理器使人们可以开始使用软件包,而不用处理上下文相关的构建说明等。我本人不知道如何提高MinGW的工作效率,因此我最终自己重复编写了很多功能,而不仅仅是使用它。没有它是愚蠢的。
德米特里

1
不必与各种安装/构建脚本和标志作斗争将是一个巨大的胜利。
themihai

3

这个问题有点混乱。上面提到的软件管理特定编程语言的扩展。它们提供了库和源代码,这些库和源代码随后可在您使用所选的编程语言进行编程时使用。

虽然一般的系统级程序包管理器通常提供二进制程序包,但无论应用程序如何,都可以使用它们。他们更面向系统和用户。当然,诸如Aptitude,rpm,Entropy之类的系统级软件包管理系统可以提供任何软件包,无论是二进制还是源代码。这就是为什么您会在其中找到大多数将与... Gem一起安装的扩展的原因。

然后,您所说的YumApt-get或Rigo只是它们下面的软件包管理系统的用户界面。

编程语言列表的另一种:

  • PHP的Composer和Pear

是的,当然。在写最后三个问题时我在想什么?
m0nhawk

问题是这些软件包在全球而不是本地获取,并且将项目的依赖关系捆绑到一个文件夹中非常困难。这意味着一个项目可能会在您的系统上运行,但是一旦将它放在另一个系统上,您就需要记住它所依赖的内容,并获取所有内容,并将它们放在您的项目期望的确切位置。这个过程是地狱。GTK就是一个例子,它易于全局安装,而难于本地安装。
德米特里

0

我意识到这不是一个跨平台的解决方案,但是应该将其添加到组合中。

CoApp最近宣布使用NuGet支持C ++软件包管理:http : //blog.nuget.org/20130426/native-support.html

当前,这仅适用于Visual Studio编译器,但是有许多要求使它在其他平台上运行。

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.