72

尽管存在数千个 Emacs Lisp 库,但 GNU Emacs 直到 24.1 版都没有(内部)包管理器。

我想大多数用户都会同意,目前查找、安装和保持最新的 Emacs Lisp 库相当不方便。

让生活更轻松的页面

对于早于 24.1 的 Emacs 版本:

  • Emacs Lisp 列表- 问题:我看到死人(链接)。
  • Emacswiki - 问题:可能包含坚果的痕迹(恶意代码)。
  • Emacsmirror - 我正在处理的包存储库。问题:还没有包管理器本身支持它。

一些包管理器

并不是没有人尝试过。(当被问到这个问题时,其中一些并不存在。)


更新——package.el 包含在 GNU Emacs 中,从 24.1 版开始


软件包已包含在 Emacs 主干中。epkg 尚未准备好,目前也不可用。至少 install-elisp、plugin 和 use-package 似乎不再积极维护了。

我创建了一个 git存储库,其中包含所有这些包管理器作为子模块。

一些可能有用的实用程序

包管理器可以使用这些实用程序和/或它们可以用于维护包的镜像。

关于手头主题的讨论

问题(最后)

所以 - 我想从你那里知道你认为在 Emacs 的包管理器中什么是重要的/不重要的/补充的等等。

一些想法

  1. 许多包(Emacsmirror提供了最大的可用包集合,但在任何包管理器中还没有明确的支持)。
  2. 只有经过测试的包。
  3. 支持多个包存档(因此人们可以在许多/经过测试的包之间进行选择)。
  4. 仅基于所需功能计算的依赖关系。
  5. 依赖项会考虑特定版本。
  6. 仅使用已在上游发布的版本。
  7. 如果可用,请使用版本控制系统中的版本。
  8. 包是分类的。
  9. 软件包不仅可以安装,还可以卸载和更新。
  10. 支持创建上游版本包的分叉。
  11. 支持发布这些分叉。
  12. 支持选择分叉。
  13. 安装包激活后。
  14. 生成自动加载文件。
  15. 与 Emacswiki 集成(参见 wikirel.el)。
  16. 用户可以标记、评论等包并共享该信息。
  17. 仅 FSF 分配/GPL/FOSS 软件或不关心许可证。
  18. 包管理器应该与 Emacs 一起分发。
  19. 支持轻松联系作者。
  20. 大量元数据。
  21. 在安装特定软件包之前建议替代方案。

我希望得到这些答案

  • 指向更多实现、讨论等的指针。
  • 对构成理想包管理器的一组功能的冗长描述。
  • 一个特定的期望/不期望的特征的描述。随意从上面详细说明我的想法。
  • 让我大吃一惊。
4

12 回答 12

32

我还在学习 Emacs,所以我还没有机会研究包管理器,但是一个很棒的功能是通知用户如果他们尝试使用包是可用的,但它不在他们的系统上。例如,我想在服务器上编辑一次 PHP 文件,我尝试过

M-x php-mode

Emacs 就像

M-x php-mode [no match]

什么时候应该像

php-mode available from ftp.gnu.org. install? (y/n)

然后它会为我安装并加载 php-mode。那会让我的一天就在那里。

于 2009-01-17T23:50:50.237 回答
28

从版本控制自动发布

我希望看到一个标准的、中央的、单一的Emacs 包管理器。现在,我会把钱放在ELPA上,但还有很长的路要走。

对 Emacs 包管理器有帮助的最重要的事情就是让发布包变得非常简单。在我看来,我希望看到这种情况与GitHub等中央托管平台上的 git 等版本控制系统结合使用——这将使作者更容易发布他们的包,并使其他人更容易回馈。

类似于 GitHub(过去)如何使发布 RubyGems 变得容易,我希望在 Emacs 包管理器中看到类似的东西。例如,使用“vX.YZ”标记您的存储库,并让您的 elisp 优点自动提供给所有人。

使用像 GitHub 这样流行的后端的额外好处是,您会立即获得大量曝光,这将有助于推动其成功。

于 2009-01-18T01:23:23.997 回答
12

我最期待的是所有有用的东西都在上面,并且运行良好。这要求你(或维护团队)积极地为它打包所有东西,并做任何涉及到的事情——给每个有用包的作者发电子邮件,等等。

例如,Debian(及其衍生产品:Ubuntu 等)之所以如此出色,是因为您可以愉快地使用您的系统,而无需在存储库之外安装任何东西,并且其上的所有内容都经过了彻底的测试。包管理器的实际功能很重要,但仅次于托管包本身。

于 2009-01-18T02:23:22.067 回答
10

轻松的配置同步:我和许多人一样,在许多不同的计算机和服务器上使用 Emacs,其中一些是我自己的,一些不是。如果包管理器有某种文件可以从一台计算机传输到另一台计算机,那就太棒了;然后,在后一台计算机上,包管理器会将我的 Emacs 带入我喜欢的状态——所有已安装的包和设置的配置。结合能够轻松安装站点范围(如果有 root 权限)或作为单个用户安装的能力,我可以在任何地方同步所有 Emacsen。

于 2009-01-18T00:40:47.860 回答
7

我几乎可以肯定,最好的解决方案包括向 ELPA 提交更多包并向 package.el 添加多源支持。Emacs 维护者表示他们会考虑在版本 24 中包含 package.el,只要它默认指向 FSF 存储库。

当然,提交也需要是一个自动化的过程;当前邮寄 ELPA 维护者的方法只适用于小规模。

于 2009-01-31T20:35:22.910 回答
6

不管怎么做,在我看来,最重要的是,将包提交到存储库应该是微不足道的。同时,我们不希望这些软件包立即可用,以防止恶意代码(以及由于许可问题)。除非有基于加密签名的“信任”系统。

也很有用:

  • “元包”,一次安装多个包。
  • 同理,我们应该可以安装一套elisp文件,为了可维护性
  • 不应允许“损坏的”包破坏 Emacs 启动。这很简单,我在自己的 .emacs 中实现了它
  • 能够安装脚本以外的文件。这经常被忽视,但非常有用。例如,您可以为图标、工具栏等发送图像。
  • 版本控制:包 X 需要包 Y > 1.0
  • 测试:执行基本的健全性检查,测试冲突(键绑定、函数重新定义、预期存在但不存在的函数等)。
  • BUG 追踪:我怎么强调这点的重要性都不为过。有一个集中的地方来报告包错误(并能够跟踪它们)对于确保包的质量非常重要。

某种压缩存档似乎是执行上述某些操作的最佳选择。


到目前为止,一个大大改进的 ELPA 似乎是要走的路。

于 2009-08-20T21:38:37.020 回答
3

我曾经花一些时间为 Emacs 编写一个小型包管理器。

http://gmarceau.qc.ca/plugin.el

我写:

Plugin 是我为 Emacs 创建包管理器的尝试。插件将自动下载 Emacs 扩展,将它们解压缩到一个目录中,将该目录添加到加载路径,生成自动加载注释,并修改您的 dot-emacs 文件。自动加载注解是 Emacs 鲜为人知的特性。一旦生成它们,Emacs 扩展就会快速且增量地加载,如果您安装了与我一样多的扩展,这真的很棒。

您将需要两个库文件来运行它,loop-constructs.elrecord.el

于 2009-01-19T15:36:16.017 回答
3

我认为 iPhone 的黑客非常接近我想要的,Ubuntu 的“apt”也是如此。

我希望能够:

  • 添加
  • 删除(仅包)
  • 删除用户设置
  • 查看文档
  • 升级(阅读更改日志后)
  • 添加新存档(又名添加存储库)
  • 查看依赖项
  • 见版本
  • 搜索名称、关键字
  • 按(添加日期、修改日期、名称)浏览
  • 保存所有已安装的软件包和设置
  • 加载一组包和设置

我想要一组主要的东西,它们都能很好地工作,并且是推荐的做任何事情的方式。然后是一个全局集合,所有工作都在其中。然后任何人都可以托管自己的档案。

如果这一切都与 git/svn/whatever 相关联,这样您就可以安装旧版本,那就太好了。通过分叉等来制作自己的补丁等等......

于 2009-01-21T15:23:54.557 回答
2

除了上面提到的之外,我还期待像 debian 和其他存储库这样的东西——一组稳定的、实验性的、未经测试的包。能够添加我自己的存储库 - 我直接使用 VCS 中的许多包,因此创建自己的包可能很有用

于 2009-01-18T11:03:32.767 回答
2

我认为包管理器应该从Rubygems中获得很多灵感。我也认为它应该有一个像Gemcutter这样的网站。

中央存储库也可以很好(例如Emacsmirror)。但是,如果存在像 Gemcutter 这样收集所有包的站点,则可能不需要这样做。

我认为这些事情对于这个工作很重要。

  • 收集所有包裹的某种中心位置
  • 易于添加软件包
  • 易于维护的软件包
  • 易于为其他软件包做出贡献
  • 易于安装、卸载和更新软件包
  • 可以添加包依赖项
  • 所有包的通用结构

因此,像 Rubygems 这样的包管理器具有像 Gemcutter 这样的站点和像 Emacsmirror 这样的中央存储库(最好在 Github 上,因为它是社交编码),这对 Emacs 来说非常有用。

总而言之,我认为应该从 Rails 以及 Rails 如何处理 Gems 中获得很多灵感。

于 2009-12-22T21:09:24.400 回答
2

我不知道这个问题有多新鲜……
但我想看到的模型是 CPAN。我也不知道 Rubygems,但它听起来类似于 CPAN。

CPAN 是一个 perl 归档 + 图书馆管理系统。当我需要编写需要... FTP 或 SOAP 或 JSON 或 XML 或 ZIP 或...等的 perl 程序时,我可以运行 CPAN 包管理器,选择下载所需的包,查看并验证依赖关系,然后安装一切。CPAN 是镜像的 ..“无处不在”。

CPAN 非常适合我的目的,并且对于 emacs 来说类似的东西会很高兴。它还支持按需构建 C/C++ 代码。

这就是我希望在 emacs 中看到的。

一些关于要求的进一步评论。

  • 显式下载软件包。没有自动安装。没有隐形下载。我想要求新的库或新功能。
  • 我应该能够列出已安装软件包的名称/版本/时间戳。
  • 如果我的朋友给我他的列表,我应该能够将他的 emacs 状态与我的进行比较。
  • 检查更新功能。有哪些可用更新?他们修什么?
  • 依赖检查、验证和下载。如果我安装 csharp-mode 并且它需要 v5.0.28 的 cc-mode,那么它应该与我确认,我还必须下载 cc-mode。
  • 这些包应该有某种社区排名,比如在 isohunt 上对种子进行排名。我想看看一个包是否有 3 个赞成票或 3000 个。
  • “交易”行为。如果安装成功,它必须放松到最后已知的良好状态。
  • 故障保险。如果我在 linum.el 中放置了自定义模块,它应该拒绝在我的更改上安装新版本,除非我明确允许它。它应该在开始之前警告我。在现有安装上使用校验和/md5 执行此操作。
  • 可以选择从压缩档案中运行一些包,例如 zip 文件。所以我从不怀疑我没有更新任何嵌入式 elisp。
  • 使用镜像主机进行软件包分发的能力。
  • 所有这些功能都应该可以通过 Mx library-manageemnt 或其他方式访问。

最后,最好有一种方法来分离或组织函数库。分层命名空间。Emacs 的平面命名空间已经过时了。这有点独立,但对包管理的核心功能是互补的。我不是 lisp 大师,所以我不知道这有多难;也许已经有办法了。

于 2010-04-12T12:11:58.133 回答
1

包管理器不提供任何我看重的具有简单依赖关系的单文件 elisp 包:添加和删除site-lisp从未引起问题。它是依赖于外部程序的包(例如,ispell),多文件包(例如,auctex、org-mode)可能很棘手。暂时想不出任何具有非平凡依赖的单文件 elisp 包。

对于这些,缺少包管理器,我希望 emacs 的 elisp-packages 获得可以整体运行的测试套件,并在依赖项失败的情况下提供有用的信息。

于 2009-12-11T13:24:53.160 回答