在Emacs中更新软件包


144

我为软件包设置了以下设置(不确定是否有更好的推荐设置):

(require 'package)
(setq package-archives '(("ELPA" . "http://tromey.com/elpa/") 
                          ("gnu" . "http://elpa.gnu.org/packages/")
                          ("marmalade" . "http://marmalade-repo.org/packages/")))

; Apparently needed for the package auto-complete (why?)
(add-to-list 'package-archives
             '("melpa" . "http://melpa.milkbox.net/packages/") t)

(package-initialize)
(setq url-http-attempt-keepalives nil)

我有三个与软件包安装和更新有关的问题。

Q1。有没有办法更新可用软件包列表(和最新版本)并更新特定软件包?

Q.2以下软件包来源有什么区别?:

  • ELPA,
  • GNU
  • 果酱
  • 梅尔帕

Q.3它们添加的顺序有关系package-archives吗?


13
MELPA是自动完成功能所必需的,因为显然没有人愿意在果酱上使用自动完成功能。不要打扰,而是清理您的package-archives。摆脱掉不再维护的ELPA存档,以及橘子果酱存档,这是一堆过期且重复的软件包,没有明确的指导和维护。仅使用标准的GNU存档,并且使用MELPA>
lunaryorn

2
谢谢@lunaryorn!这很有帮助。您知道我该如何保持了解情况吗?(即随着Emacs的发展,诸如此类的“美好的事物”)
Amelio Vazquez-Reina

3
信息可以自由地在网络上四处传播:只需关注Reddit上的/ emacs,关注Nic Ferrier,Bozhidar Batsov,Magnar Sveen,John Wiegley等著名Emacs人士的博客和推特,就可以在Freenode IRC上加入#emacs,还有很多。
lunaryorn

3
(setq package-enable-at-startup nil)如果您要称呼(package-initialize)自己,则应该这样做。
菲尔2014年

2
感谢@phils-为什么需要这样做?
Amelio Vazquez-Reina 2014年

Answers:


163
  1. 为了自动更新软件包列表,仅当已经没有软件包列表时,才使用以下命令:

    (when (not package-archive-contents)
        (package-refresh-contents))

    为了更新所有已安装的软件包,请键入package-list-packages,它将带您进入*Packages*缓冲区(并更新软件包列表),然后键入U x

    package-refresh-contents无条件尝试从您添加到的所有仓库中下载软件包清单package-archives; package-archive-contents如果您已经下载了软件包列表,则为非零。

  2. ELPA是原始的。我认为它不再真正维护了,但我不确定。我不使用它。

    GNU是“官方的”。它与Emacs一起维护,这意味着事情应该一直有效,但是更新和新软件包并不经常出现。

    果酱基本上是一个网站,您可以在其中上传完整的软件包,并将其添加到果酱回购中。您不仅要提交到包上游的链接,而且还不能完全完全自动化包的创建。我认为这是对的,因为您不一定要跟踪上游。不幸的是,它已经有一段时间没有被维护了,但是最近有人接管了它,因此它应该可以恢复并在某个时候更好。

    Melpa将URL转到例如EmacsWiki lisp区域或github存储库,并从中自动构建一个包。因此,无论追踪什么,通常最多一天。尽管它跟踪上游,但在实践中我从来没有遇到问题,而这正是我大多数软件包的来源。还有Melpa Stable,它类似于Melpa,但是会获取上游存储库的标记修订版本,而不是最新版本。Melpa稳定版的软件包少于Melpa。

    组织模式有自己的存储package.el库(http://orgmode.org/elpa/)。

    所有的软件包存储库工作都相同,只需将它们添加到中即可package-archives

    这是有关此主题的更深入的博客文章,我大都同意。

  3. 我不确定,但是我认为如果软件包在不同的存储库中重复,存储库出现的顺序将package-archives确定优先级。我不知道更高的优先级是在列表的开头还是结尾。

    更新:在Emacs 25中,package-archive-priorities可以使用一个变量来确定软件包存储库的优先级(例如,优先选择ELPA而不是MELPA)。


init.el如果您对此感兴趣,这是我的相关部分:

(setq jpk-packages
      '(
        ac-dabbrev
        ...
        yasnippet
        ))

(package-initialize)
(add-to-list 'package-archives
             '("melpa" . "http://melpa.org/packages/"))
(add-to-list 'package-archives
             '("org" . "http://orgmode.org/elpa/"))

;; install any packages in jpk-packages, if they are not installed already
(let ((refreshed nil))
  (when (not package-archive-contents)
    (package-refresh-contents)
    (setq refreshed t))
  (dolist (pkg jpk-packages)
    (when (and (not (package-installed-p pkg))
             (assoc pkg package-archive-contents))
      (unless refreshed
        (package-refresh-contents)
        (setq refreshed t))
      (package-install pkg))))

(defun package-list-unaccounted-packages ()
  "Like `package-list-packages', but shows only the packages that
  are installed and are not in `jpk-packages'.  Useful for
  cleaning out unwanted packages."
  (interactive)
  (package-show-package-list
   (remove-if-not (lambda (x) (and (not (memq x jpk-packages))
                            (not (package-built-in-p x))
                            (package-installed-p x)))
                  (mapcar 'car package-archive-contents))))

2
谢谢!什么when (not package-archive-contents)检查?
Amelio Vazquez-Reina

3
有条件的阻止每次我启动emacs时刷新(我通常只希望在告诉我时才检查它)。它仅检查是否没有软件包归档,只有在我第一次将配置克隆到新计算机时才应如此。
jpkotta

只是让您知道@Brandy Trainor的答案,这似乎可以补充您的答案-如果有帮助的话。
Amelio Vazquez-Reina 2014年

我认为这需要(refresh-package-contents)在下载新软件包之前无条件调用,否则Emacs可能会尝试下载旧的软件包版本(此时为404),失败并停止加载。
弗拉基米尔·潘捷列夫

了解不需要哪个软件包的最佳方法是什么?@jpkotta
alper

103

在Emacs中,用于M-x list-packages列出所有将自动刷新档案内容的软件包。之后用于U标记所有要升级的可升级软件包,并x实际执行新的更新。然后,Emacs将获取并安装所有升级,然后询问您是否随后删除旧的,过时的版本。

您可能还想看看Carton,它通过在专用文件中声明它们来提供一种更方便的方式来管理软件包,并包括一个方便的命令行客户端,可以自动安装和升级以此方式声明的软件包。


的顺序package-archives没有关系。Emacs将所有档案的内容聚合到一个统一的可用软件包及其版本列表,存储在中package-archive-contents

在之后package-install,Emacs会简单地选择软件包的最新版本,而不考虑原始存档。为了更好地控制软件包的来源,MELPA提供了melpa软件包,该软件包允许将来自指定档案的软件包列入黑名单或白名单。


2
这是S-u更精确。
Lenar Hoyt 2015年

@mcb是什么S-u?程序包菜单不使用该绑定。
lunaryorn

2
我是说Shift-u那个。
Lenar Hoyt

8
@mcb那么,这就是为什么我写了一个大写的
U😊– lunaryorn

1
只是对于像我这样困惑的人来说,这意味着<kbd> U </ kbd>。
Lenar Hoyt

23

在终端:

emacs

M-x list-packages

这使您进入* packages *缓冲区

shift-u x

emacs会询问您(是/否),等待更新

C-x k <ret>

这将杀死* packages *缓冲区,并使您回到* scratch *

C-x-C-c

这将退出emacs,并让您重新启动,但是您可能需要调试:(

emacs

我的2美分


键入“ U”时,我没有“未指定命令”或类似内容。运行后M-x package-refresh-contents,它提示我键入“ U”以将所有标记为要更新,然后我可以键入“ x”以运行更新。
MrColes

2

这更多是对jpkotta答案的扩展评论。

这是我针对jpkotta的答案尝试的一种调整:

(setq n 0)                                  ; set n as 0
(dolist (pkg pkgs-2b-present)               ; for each pkg in list
  (unless (or                               ; unless
           (package-installed-p pkg)        ; pkg is installed or
           (assoc pkg                       ; pkg is in the archive list
                  package-archive-contents))
    (setq n (+ n 1))))                      ; add one to n
(when (> n 0)                               ; if n > 0, 
  (package-refresh-contents))               ; refresh packages

(替换(when (not package-archive-contents) (package-refresh-contents)))。

对于我的用例,软件包列表的刷新频率不足。

我没有考虑过是否有更有效的解决方案。首先,我要看看这种调整是否能解决问题。


在我的回答中,package-archive-contents仅当不存在时才刷新。想法是将.emacs.d复制到新计算机上,它会自动安装所有软件包,但之后必须手动更新。我尝试每两周更新一次。我猜您已将一个包裹添加到列表中,但是您package-archive-contents太老了而无法拥有它?
jpkotta 2014年

@jpkotta,我有一个双引导程序,每个引导程序都使用它们的默认~/.emacs.d/elpa/包位置。但是,我的软件包安装代码版本在“第三个”分区(e:/emacs-config/e/emacs-config/)中。因此,我在一个操作系统中将软件包添加到列表中,并且Emacs在另一个操作系统中加载时应更新。可以肯定的是,我的解决方案中存在一些矫kill过正的元素,但它似乎至少在起作用。
Brady Trainor 2014年

@jpkotta,为什么我的我package-archive-contents似乎太过失落了?这是我没有缩小的问题。如果将来寻找并找到“更优雅”的解决方案,我会将其添加到我的帖子中。
Brady Trainor 2014年

1
(package-refresh-contents)写入~/.emacs.d/elpa/archives。还不清楚您是否在操作系统之间共享该目录。我建议不要共享elpa/目录,因为Emacs字节码(其中的代码elpa/是字节编译的)不向后兼容(gnu.org/software/emacs/manual/html_node/elisp/…)。您必须确保两个安装都具有相同版本的Emacs。我保持.emacs.d版本控制,并与此同步其他安装。
jpkotta 2014年
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.