在 Emacs 中更新包

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

(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)

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

问题1。有没有更新可用软件包(和最新版本)列表和更新特定软件包的方法?

问.2 下列软件包来源有何分别:

  • ELPA,
  • GNU
  • 橘子酱
  • Melpa

问.3 它们加入 package-archives的顺序是否重要?

119615 次浏览
  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 一起维护,这意味着事情应该始终工作,但更新和新包不经常出现。

    Marmalade 基本上是一个网站,你可以上传一个完整的包,它将被添加到 Marmalade repo。你不能仅仅提交一个到包上游的链接,而且它不能完全自动化包的创建。我认为这是正确的事情,因为你不一定要追踪上游。不幸的是,它已经有一段时间没有维护了,但是最近有人接管了它,所以它应该会回来,在某个时候会更好。

    Melpa 接受一个 URL,例如 EmacsWiki lisp 区域或 github repo,并从中自动构建一个包。因此,它通常最多落后于它所追踪的任何东西一天。虽然它追踪的是上游,但在实践中我从来没有遇到过问题,而且我的大多数软件包都来自这里。还有 梅尔帕马厩,它类似于 Melpa,但抓取标记修订的上游回购,而不是最新的修订。马尔帕稳定的包装比马尔帕少。

    Org 模式 有自己的 package.el repo (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))))

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

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


package-archives的顺序对 没有有影响。Emacs 将所有存档的内容聚合成一个单一的可用包及其版本的一致列表,存储在 package-archive-contents中。

package-install上,Emacs 将简单地选择软件包的最新版本,而不管原始归档文件是什么。为了更多地控制包的来源,MELPA 提供了 Melpa 包裹,它允许从指定的档案黑名单或白名单包。

这更像是对 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)))。

对于我的用例来说,包列表刷新不够频繁。

我还没有考虑是否有一个更有效的解决方案来解决我的问题; 首先,我要看看这个问题是否随着这个调整而消失。

终点站:

emacs


M-x list-packages

这将把您放在 * 软件包 * 缓冲区中

shift-u x

Emacs 会询问你(y/n) ,等待更新

C-x k <ret>

这将杀死 * 软件包 * 缓冲区,并返回到 * 从头开始 *

C-x-C-c

这将退出 emacs,并让您通过重新启动,但您可能必须调试: (

emacs

我的2