簡體   English   中英

在Emacs中更新包

[英]Updating packages in 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)

我有三個與安裝和更新包有關的問題。

Q1。 有沒有辦法更新可用包列表(和最新版本)並更新特定包?

Q.2以下包源有什么區別?:

  • ELPA,
  • GNU
  • 果醬
  • melpa

Q.3它們被添加到package-archives的順序是否重要?

  1. 為了自動更新軟件包列表, 僅當沒有軟件包列表時 ,請使用以下命令:

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

    要更新所有已安裝的軟件包,請鍵入package-list-packages ,它將轉到*Packages*緩沖區(並更新軟件包列表),然后鍵入U x

    package-refresh-contents無條件地嘗試從您添加到package-archives所有repos下載包列表; 如果您已經下載了包列表,則package-archive-contents不是nil。

  2. ELPA是原創的。 我認為它不再維持,但我不確定。 我不使用它。

    GNU是“官方的”。 它與Emacs一起維護,這意味着事情應該始終有效,但更新和新包裝不會經常出現。

    Marmalade基本上是一個網站,你可以上傳一個完整的包,它將被添加到橘子醬回購。 您不僅要提交包的上游鏈接,而且還不能完全自動創建包。 我認為這是正確的事情,因為你不一定想跟蹤上游。 不幸的是,它已經有一段時間沒有維護了,但是有人最近接受了它,所以它應該在某些時候恢復並且更好。

    Melpa將URL作為例如EmacsWiki lisp區域或github repo,並從中自動構建包。 因此,通常最多只追蹤它追蹤的一天。 雖然它跟蹤上游,但我在實踐中從未遇到過問題,而這正是我的大多數軟件包所在的地方。 還有Melpa Stable ,它就像Melpa一樣,但是獲取了上游回購的標記修訂而不是最新版本。 Melpa穩定包裝比Melpa少。

    組織模式有自己的package.el repo( http://orgmode.org/elpa/ )。

    所有的包repos都是一樣的,你只需將它們添加到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中,使用Mx list-packages列出將自動刷新存檔內容的所有包。 然后使用U標記要升級的所有可升級包,並使用x實際執行新更新。 然后,Emacs將獲取並安裝所有升級,並詢問您之后是否刪除舊的過時版本。

您可能還想看看Carton ,它通過在專用文件中聲明它們來提供更方便的方法來管理您的包,並且包括一個方便的命令行客戶端來自動安裝和升級以這種方式聲明的包。


順序package-archives 並不重要。 Emacs將所有存檔的內容聚合到一個連貫的可用包及其版本列表中,存儲在package-archive-contents

package-install ,Emacs將簡單地選擇最新版本的軟件包,而不管源軟件是什么。 為了更好地控制包裝原產地,MELPA提供了melpa包 ,允許從指定的檔案中包裝黑名單或白名單。

在終端:

emacs

M-x list-packages

這會讓你進入* packages *緩沖區

shift-u x

emacs會問你(是/否),等待更新

C-x k <ret>

這將殺死* packages *緩沖區並返回* scratch *

C-x-C-c

這將退出emacs,讓你重新啟動,但你可能要調試:(

emacs

我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)) )。

對於我的用例,包列表不夠經常刷新。

我沒有考慮是否有更有效的解決方案來解決我的問題; 首先,我要看看這個調整是否會消失。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM