谁拥有最好的包管理器?第一部分

每种主要语言都有数千个库,这些库使程序员能够比以前更高、更远、更快地实现目标。包管理器(代码共享的在线系统)是语言成功的关键;Perl、PHP、Python、Ruby和Node.js都提供了强大的支持。但哪一个是最好的,我们能从每个中学习到什么?本文是两篇系列文章的第一篇,我将回顾每个包管理器。第一部分重点关注搜索和使用包,第二部分将探讨上传和共享包的难易程度。

术语

当提到在线代码共享系统时,“包管理器”这个术语并不完全准确。《a href="https://rubygems.org.cn/">RubyGems和npm被描述为包管理器,但对于PythonPyPI是一个包索引,pip是包管理器。同样,metacpanCPAN的搜索引擎。我使用“包管理器”一词来指代常用的用于搜索、审查、安装和共享代码的工具集合。

输入和评分标准

以下包管理器被审查:

每个包管理器都针对以下5个标准进行了评分

  • 搜索 - 找到所需内容有多容易。理想的搜索功能将首先返回最相关的包,并提供信息以帮助用户区分包。
  • 元数据 - 提供哪些支持数据以提供上下文并使用户更好地理解包:名称、描述、下载次数、单元测试覆盖率、可移植性、依赖项、用户评价等。
  • 文档 - 包文档的可用性和易用性。易于使用的文档布局清晰一致,并提供了对潜在包消费者的有用信息。
  • 源代码 - 源代码的可用性和易用性。源代码应易于检查,这意味着提供易于导航的目录树并以可读、有用的方式呈现代码。
  • 安装 - 安装包有多容易:是否提供了说明,并且安装是否成功。

我将在1到5之间对每个标准进行评分,5分表示最佳。显然,这是一个主观的方法,既包括选择的标准,也包括给出的评分的强度。结果是否具有实用性,我将留给读者您来决定。

方法

使用了3个搜索词:“selenium”、“sqlite3”和“web framework”。在输入时,搜索词未加引号。Selenium应该是一个容易搜索的词,因为它的名字独特且是常见的库(Selenium WebDriver的绑定)。SQLite3稍微困难一些,因为它包含版本号,许多名为“sqlite”的包都是为SQLite3设计的。Web framework是最难的,因为它是一个描述而不是一个名称,但我们希望搜索返回相关结果,如Sinatra、Django和express。对于每种语言,我使用推荐列表作为我的目标包。在所有搜索中,我都考虑了相关结果的排序和搜索结果中提供的信息的有用性。

在每次搜索中找到目标结果后,我打开了包页面并评分其他标准。只考虑了由3个搜索词返回的包。

PHP:Packagist

首先介绍的是Packagist,这是最大的PHP包搜索引擎,拥有超过36,000个已索引的。Packagist与Composer集成,后者是一个PHP依赖管理工具。

当我输入搜索词时,Packagist会自动聚焦到文本搜索框并实时显示搜索结果。对于每个搜索结果,Packagist都会返回包名、描述、下载次数和星级。搜索结果分页显示,但未提供排序或筛选搜索结果的功能。

搜索结果参差不齐:目标selenium包在结果列表中排名第三。对SQLite3的搜索没有返回任何有用的包(SQLite3的绑定),这可能是因为PHP 5.3自带了一个内置的SQLite类。Web框架的搜索在顶部20个结果中没有找到任何目标包,其中Laravel排在第21位。

搜索:35

Packagist提供了一套基本元数据,包括:名称、描述、版本号、下载统计、版本历史和依赖关系。没有提供任何包的许可信息、单元测试覆盖率、平台兼容性或持续集成结果。没有提供“收藏”或评论模块的功能(可能搜索结果中的星级来自GitHub)。

元数据:25

文档很稀疏——提供了一个链接到GitHub仓库,默认显示仓库的readme文件。在标题或内容方面,各个包之间似乎没有太多的统一性。

文档:25

Packagist链接到了GitHub上的源仓库。代码容易导航,尽管目录树结构不统一。

源:35

使用PHP Composer进行安装,通过在json文件中将目标包标记为“必需”来完成。可以直接使用Composer在命令行中安装包。

$ composer.phar require "laravel/framework": "4.2.8" 

Packagist在每个包页面上列出了所需文本。

安装:55

Packagist总体评分:3.0

Python:PyPI

接下来是Python的PyPi,拥有超过47,500个包。

PyPI的搜索结果返回了包名、一个名为“权重”的匹配强度指标和描述。对于SeleniumSQLite3的搜索结果很好,目标库每次都出现在前两个结果中。

对于“Web框架”的搜索结果参差不齐:我正在寻找常见的Python Web框架,但只有Watson一个出现在前20个结果中。Django排在第280位,Flask排在第574位。PyPI是唯一不分页搜索结果的包管理器,这使得遍历搜索结果和导出它们变得容易。没有根据不同标准筛选或排序结果的功能。

搜索:35

提供的元数据因包而异,但PyPI通常提供:最后上传日期、下载次数、作者姓名、包所有者和维护者、包主页链接和一个DOAP.xml记录。《Watson》包包含构建状态和单元测试覆盖率。只有1个包提供了许可信息。似乎没有提供用户评论或“星级”的功能,以表明包是否好。

元数据:35

文档混合,要么没有文档,要么只提供高级概述。在大多数情况下,外部链接到另一个网站提供了更多文档,但并不一致(可能是Google代码、GitHub或项目特定的网站)。

文档:25

所有软件包的源代码都由GitHub或Google Code托管,并在PyPI上提供链接。这很好,但可能需要几个步骤才能找到实际的源代码,并且源代码树的架构因包而异;例如,它可能只是根目录中一系列*.py文件的集合。

来源:25

PyPI在其主页上提供了安装指南。此外,大多数已审查的软件包的文档都包含了安装软件包的命令行代码说明。所有三个软件包都使用pip顺利安装,尽管看起来在安装时没有运行单元测试,因此这些软件包是否工作还是一个问题。

安装:55

PyPI总体:3.0

Perl:metacpan

metacpan被描述为一个CPAN 搜索引擎,提供了几乎所有CPAN的功能,以及CPAN没有提供的许多功能。它自2013年以来一直存在,索引了超过30,000个软件包。

metacpan的搜索页面自动聚焦到文本输入搜索框,并提供预测性文本搜索。搜索结果包含软件包名称、描述、平均评分(如果有评分)、“++”数量(类似于GitHub的星星)和作者名称。方便的是,同一命名空间中的子软件包在高级软件包下方缩进。

Selenium搜索首先返回目标软件包(WWW:Selenium),然而SQLite3的目标软件包(DBD::SQLite)在搜索结果中排在第17位。Web框架的搜索结果不太好:前20个结果是旧框架或无关的软件包。然而,目标软件包(例如Catalyst、Dancer、Mojolicious和Kelp)在顶部40个结果中。metacpan对搜索结果进行了分页,每页20个,这意味着目标软件包实际上在第2页。没有提供筛选或排序搜索结果的方法。

搜索:35

metacpan提供了大量的软件包元数据:软件包名称、描述、版本号、活动直方图、问题列表、CPAN Testers 结果(一个外部CI平台,该平台在许多不同的操作系统和Perl版本上运行软件包以检测可移植性问题)、kwalitee评分、评论和“++”计数。它还提供依赖列表、依赖软件包列表和依赖关系图表。以下是一个WWW::Selenium的示例。

有趣的是,metacpan没有提供任何软件包的下载统计信息。这似乎对用户来说是一个有用的质量指标。metacpan可能因“信息过载”而略有不足 - 链接和指标太多,用户可能难以从噪音中区分重要的指标。尽管metacpan列出了许可证名称,但没有提供指向基础许可证文本的链接,这将是有用的。没有报告单元测试覆盖率。

元数据:55

除了Web框架软件包(Dancer)的情况外,文档非常全面,该软件包包含高级示例,然后链接到包含在其他软件包中的文档。特别令人高兴的是,文档易于访问并且风格一致,因为所有内容都是通过metacpan提供的。

文档:55

每个软件包页面上都提供了直接链接到源代码。源代码也托管在metacpan上,并且风格一致。提供了一些有用的度量:代码行数、文档行数和千字节文件大小。我还可以切换内联文档(称为“Pod”)的开关,并查看原始代码。另一个有用的功能:源代码中的每个软件包引用都是到该软件包源代码的超链接。

然而,如何导航包树并不明确(链接都在包名本身中)。一个包托管在GitHub上,在包页面上提供了直接链接到仓库——所以用户可以选择在GitHub上查看源代码,如果他们更喜欢metacpan的话。

来源: 55

metacpan没有提供安装模块的信息。

安装: 15

metacpan总体评分:3.8

Node.js:npm

npm 是 Node.js 的包管理器。它拥有超过 89,500 个包,是本评测中任何包管理器中最多的。

npm 的搜索结果良好:尽管目标 Selenium 在结果列表中排名第七,但 SQLite3 和 Web 框架的搜索都返回了目标包(sqlite3express)在结果列表中排在第一位。npm 显示了包名、描述、下载统计、星级数和关键词列表。搜索结果分页,没有提供过滤或排序功能。

搜索: 55

npm 提供了一套有用的元数据,包括:下载统计、许可证、问题链接、版本、依赖和依赖包。当可用时,它还会从 GitHub 中提取 Travis CI 状态。没有提供有关单元测试覆盖率或平台可用性的信息。似乎没有添加用户对包评价的功能。

元数据: 45

文档很差——npm 只显示了包的README。尽管文档风格一致,但在布局和内容上并不一致。每个包都使用了不同的标题和不同的内容。

文档:25

npm 只提供了源仓库的链接。Selenium 仓库 在 Google Code 上,npm 提供了 URL 但没有链接。Selenium 的源代码链接甚至没有直接指向 Node.js 包——它指向了主要的 Selenium 源代码。其他两个包(SQLite3,express)更好:它们托管在 GitHub 上,有一致的包树(lib 和测试目录),并且很容易浏览源代码。

源:35

npm 首页解释了如何安装包,并链接到一个更详细的示例页面。每个包页面都包含了安装说明。所有三个包都安装无误。不清楚安装过程中是否运行了任何单元测试。

安装:55

npm总体评分:3.8

Ruby:RubyGems

RubyGems 是 Ruby 的包管理器,拥有超过 87,000 个包。

RubyGems 的搜索结果参差不齐,对于 SQLite3 和 Selenium 的搜索,目标包出现在前两个结果中。然而,RubyGems 在 Web 框架搜索中没有返回任何结果,这对于 Ruby on Rails 的普及程度来说令人惊讶。对于每个搜索结果,RubyGems 显示了包名、描述和下载次数。结果分页,没有提供排序或过滤结果的功能。

搜索: 25

提供了一套基本的元数据:包名、描述、作者、版本号、下载统计、许可证名称、依赖和版本历史时间线。没有提供“收藏”或评价模块的功能。没有提供关于跨平台支持或单元测试覆盖率的任何信息。

元数据:25

RubyGems 的文档由指向外部网站的链接组成。SQLite3 包使用了 RubyDoc,类似于更漂亮的 JavaDoc。Selenium-Webdriver 使用了 Google Code,而 Sinatra 的情况则是他们自己的 网站。文档在风格、布局、内容和质量上不一致。

文档:25

RubyGems 提供了指向两个外部仓库的链接(SinatraSelenium-Webdriver)。Selenium 源代码的链接这里是指向基础 Selenium 包,而不是 Ruby 包。对于 SQLite3 包没有提供源代码链接。

来源:25

每个包页面都提供了命令行安装说明。然而在我的机器(Fedora 19)上,有两个包安装失败,出现了相同的错误:mkmf.rb 找不到 ruby 的头文件。我能够使用 Fedora 包管理器安装这些包。

安装: 25

RubyGems 总体评分为 2.0

结论

npmmetacpan 都获得了 3.8 分,并列第一。npm 拥有优秀的搜索功能,但需要更好的文档。没有任何包管理器提供了对搜索结果进行排序或进一步过滤的方法,这似乎是一个错过的机会 - 能够按最后上传日期排序搜索结果将非常有帮助,这可以帮助用户从结果中排除过时的包。

metacpan 的搜索本可以更好,但它的文档非常出色。有趣的是,CPAN 几乎没有对文档提出要求,但整体评分最高。这可能是由于底层 CPAN 工具链已有 19 年历史,并且已经建立了良好的规范。metacpan 还通过几个增强功能很好地展示了源代码,例如能够切换显示内联文档。metacpan 应该为每个包提供安装说明,这将很容易使用 cpan 命令行工具生成模板。CPAN 镜像的分布式网络可能意味着下载统计信息不容易提供给 metacpan,但这可以成为 metacpan 提供的丰富包元数据集的有用补充。

PyPI 和 Packagist 都是全能型,每个得分 3.0。在两种情况下,更好的文档和更多的包元数据将使它们更易于使用。

RubyGems 的评分仅为 2.0,这意味着所有领域都有改进的空间。我猜测,奇怪的搜索结果可能可以通过搜索包描述以及包名称来改进,这样搜索“web framework”就会返回结果。

在第二部分中,我将考虑每个包管理器如何帮助用户上传和共享包。

评估

结果是主观的,但我希望它们大致具有代表性。选择不同的搜索词可能会显著改变结果 - 例如,也许有些包的文档比其他包更好。还可以改变每个标准的统一加权,以反映每个标准的相对重要性(例如,搜索是否比源代码可访问性更重要?)。也不要排除作者的无知 :)。包管理器的列表也可以扩展。我主要关注脚本语言包管理器,但有很多可供选择这里

感谢

感谢 Neil Bowers 提供了这篇文章的初步想法和反馈。所有错误都是我自己的。


这篇文章最初发布在 PerlTricks.com 上。

标签

David Farrell

David 是一名专业程序员,他经常 推文博客 关于代码和编程艺术。

浏览他们的文章

反馈

这篇文章有什么问题吗?请通过在 GitHub 上打开问题或拉取请求来帮助我们。