Aktualisieren von Paketen in Emacs

144

Ich habe das folgende Setup für Pakete (nicht sicher, ob es ein besser empfohlenes gibt):

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

Ich habe drei Fragen zur Installation und Aktualisierung von Paketen.

Q1. Gibt es eine Möglichkeit, die Liste der verfügbaren Pakete (und der neuesten Versionen) zu aktualisieren und ein bestimmtes Paket zu aktualisieren?

F.2 Was ist der Unterschied zwischen den folgenden Paketquellen?:

  • EL PA,
  • GNU
  • Marmelade
  • Melpa

F.3 Ist es wichtig, in welcher Reihenfolge sie hinzugefügt werden package-archives?

Amelio Vazquez-Reina
quelle
13
MELPA wird für die automatische Vervollständigung benötigt, da sich offensichtlich niemand die Mühe gemacht hat, die automatische Vervollständigung auf Marmelade verfügbar zu machen. Mach dir keine Sorgen, sondern räum deine auf package-archives. Befreien Sie sich vom ELPA-Archiv, das nicht mehr gepflegt wird, und vom Marmeladenarchiv, bei dem es sich um ein Durcheinander veralteter und duplizierter Pakete ohne klare Anleitung und Wartung handelt. Verwenden Sie nur das Standard-GNU-Archiv und MELPA>
Mondhorn
2
Danke @lunaryorn! Das ist sehr hilfreich. Wissen Sie, wie ich über solche Dinge auf dem Laufenden bleiben kann? (dh "gute Dinge zu wissen" wie diese, wenn sich Emacs weiterentwickelt)
Amelio Vazquez-Reina
3
Informationen fließen frei im Web herum, fangen Sie sie einfach ein: Folgen Sie / emacs auf Reddit, folgen Sie Blogs und Twitter von renommierten Emacs-Leuten wie Nic Ferrier, Bozhidar Batsov, Magnar Sveen, John Wiegley usw., treten Sie #emacs auf Freenode IRC bei, und viele mehr.
Mondhorn
3
Sie sollten, (setq package-enable-at-startup nil)wenn Sie sich (package-initialize)selbst anrufen wollen .
Phils
2
Danke @phils - Warum wird das benötigt?
Amelio Vazquez-Reina

Antworten:

163
  1. Verwenden Sie Folgendes, um die Liste der Pakete nur dann automatisch zu aktualisieren, wenn noch keine Paketliste vorhanden ist :

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

    Um alle installierten Pakete zu aktualisieren, geben Sie Folgendes ein, package-list-packagesum zum *Packages*Puffer zu gelangen (und aktualisieren Sie auch die Liste der Pakete), und geben Sie dann ein U x.

    package-refresh-contentsversucht bedingungslos, eine Paketliste von allen Repos herunterzuladen, die Sie hinzugefügt haben package-archives; package-archive-contentsist nicht gleich Null, wenn Sie die Paketliste bereits heruntergeladen haben.

  2. ELPA ist das Original. Ich glaube nicht, dass es wirklich mehr gepflegt wird, aber ich bin mir nicht sicher. Ich benutze es nicht.

    GNU ist "offiziell". Es wird zusammen mit Emacs gepflegt, was bedeutet, dass die Dinge immer funktionieren sollten, aber Updates und neue Pakete nicht sehr oft kommen.

    Marmelade ist im Grunde eine Website, auf der Sie ein komplettes Paket hochladen können, das dem Marmeladen-Repo hinzugefügt wird. Sie senden nicht nur einen Link zum Upstream des Pakets und es automatisiert die Erstellung des Pakets nicht vollständig. Ich denke, das ist das Richtige, weil Sie nicht unbedingt Upstream verfolgen möchten. Leider wurde es für eine Weile nicht gewartet, aber jemand hat es kürzlich übernommen, so dass es irgendwann zurück und besser sein sollte.

    Melpa verwendet eine URL, z. B. zum EmacsWiki-Lisp-Bereich oder zu einem Github-Repo, und erstellt daraus automatisch ein Paket. Daher ist es normalerweise höchstens einen Tag hinter dem zurück, was es verfolgt. Obwohl es stromaufwärts verfolgt wird, hatte ich in der Praxis nie ein Problem, und daher stammen die meisten meiner Pakete. Es gibt auch Melpa Stable , das Melpa ähnelt, jedoch markierte Revisionen des Upstream-Repos anstelle der neuesten Revision erfasst. Melpa Stall hat weniger Pakete als Melpa.

    Der Org-Modus hat ein eigenes package.elRepo ( http://orgmode.org/elpa/ ).

    Alle Paket-Repos funktionieren gleich, Sie fügen sie einfach zu Ihrem hinzu package-archives.

    Hier ist ein ausführlicherer Blog-Beitrag zu diesem Thema, dem ich größtenteils zustimme.

  3. Ich bin nicht sicher, aber ich denke, wenn ein Paket in verschiedenen Repos dupliziert wird, bestimmt die Reihenfolge, in der die Repos erscheinen, package-archivesdie Priorität. Ich weiß nicht, ob am Anfang oder am Ende der Liste eine höhere Priorität steht.

    Update: In Emacs 25 gibt es eine Variable package-archive-priorities, mit der Sie Ihre Paket-Repos priorisieren können (z. B. bevorzugen Sie ELPA gegenüber MELPA).


Hier ist der relevante Abschnitt von mir init.el, wenn Sie interessiert sind:

(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))))
jpkotta
quelle
2
Vielen Dank! Was when (not package-archive-contents)prüft?
Amelio Vazquez-Reina
3
Die Bedingung verhindert, dass jedes Mal aktualisiert wird, wenn ich Emacs starte (ich möchte normalerweise nur, dass es überprüft wird, wenn ich es sage). Es wird nur geprüft, ob keine Paketarchive vorhanden sind. Dies sollte nur der Fall sein, wenn ich meine Konfiguration zum ersten Mal auf einen neuen Computer klone.
Jpkotta
Ich möchte Sie nur über die Antwort von @Brandy Trainor informieren, die Ihre Antwort zu ergänzen scheint - falls dies hilfreich ist.
Amelio Vazquez-Reina
Ich denke, dies muss (refresh-package-contents)unbedingt aufgerufen werden, bevor neue Pakete heruntergeladen werden, da Emacs andernfalls versuchen könnte, eine alte Paketversion (die bis dahin eine 404 ist) herunterzuladen, fehlschlagen und das Laden beenden kann.
Vladimir Panteleev
Was ist der beste Weg, um zu verstehen, welches Paket unerwünscht ist? @jpkotta
alper
103

Verwenden Sie M-x list-packagesin Emacs, um alle Pakete aufzulisten, die den Archivinhalt automatisch aktualisieren. Verwenden Sie anschließend Udiese Option, um alle zu aktualisierenden aktualisierbaren Pakete zu markieren und xdie neuen Aktualisierungen tatsächlich durchzuführen. Emacs ruft dann alle Upgrades ab, installiert sie und fragt Sie, ob Sie die alten, veralteten Versionen anschließend entfernen möchten.

Vielleicht möchten Sie auch einen Blick auf Carton werfen, der eine bequemere Möglichkeit zum Verwalten Ihrer Pakete bietet, indem Sie sie in einer dedizierten Datei deklarieren, und einen praktischen Befehlszeilenclient enthält, mit dem auf diese Weise deklarierte Pakete automatisch installiert und aktualisiert werden.


Die Reihenfolge package-archivesspielt keine Rolle. Emacs fasst den Inhalt aller Archive in einer einzigen zusammenhängenden Liste der verfügbaren Pakete und ihrer Versionen zusammen, die in gespeichert sind package-archive-contents.

Anschließend package-installwählt Emacs einfach die neueste Version eines Pakets aus, unabhängig vom ursprünglichen Archiv. Für mehr Kontrolle über die Paketherkunft bietet MELPA das Melpa-Paket , mit dem Pakete aus bestimmten Archiven auf die schwarze oder weiße Liste gesetzt werden können.

Mondhorn
quelle
2
Das ist S-ugenauer.
Lenar Hoyt
@mcb Was ist S-u? Das Paketmenü verwendet diese Bindung nicht.
Mondhorn
2
Ich meine Shift-udamit.
Lenar Hoyt
8
@mcb Nun, deshalb habe ich eine Hauptstadt U 😊
Mondhorn
1
Es ist nur für die Verwirrten wie mich, die denken, dass dies <kbd> U </ kbd> bedeutet.
Lenar Hoyt
23

Im Terminal:

emacs

M-x list-packages

Dies versetzt Sie in den Puffer * packages *

shift-u x

emacs wird Sie fragen (j / n), auf Updates warten

C-x k <ret>

Dadurch wird der * Pakete * -Puffer beendet und Sie kehren zu * Scratch * zurück.

C-x-C-c

Dadurch werden Emacs beendet und Sie können über neu starten, aber möglicherweise müssen Sie Folgendes debuggen :(

emacs

meine 2 ¢

rezwits
quelle
Ich habe "kein Befehl angegeben" oder ähnliches erhalten, als ich "U" eingegeben habe. Nach dem Ausführen M-x package-refresh-contentswurde ich aufgefordert, "U" einzugeben, um alle für die Aktualisierung zu markieren, und dann konnte ich "x" eingeben, um die Aktualisierungen auszuführen.
MrColes
2

Dies ist eher ein ausführlicher Kommentar zu jpkottas Antwort.

Dies ist eine Anpassung, mit der ich für die obige Antwort von jpkotta experimentiere:

(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

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

Die Paketliste wurde für meinen Anwendungsfall nicht oft genug aktualisiert.

Ich habe nicht darüber nachgedacht, ob es eine effizientere Lösung für mein Problem gibt. Zuerst muss ich sehen, ob das Problem mit dieser Anpassung behoben ist.

Brady Trainor
quelle
In meiner Antwort package-archive-contentswird nur aktualisiert, wenn es nicht existiert. Die Idee ist, dass Sie Ihre .emacs.d auf einen neuen Computer kopieren und automatisch alle Ihre Pakete installieren. Danach müssen Sie jedoch manuell aktualisieren. Ich versuche etwa alle zwei Wochen ein Update durchzuführen. Ich vermute, Sie haben ein Paket zu Ihrer Liste hinzugefügt, aber Sie package-archive-contentswaren zu alt, um es zu haben?
Jpkotta
@jpkotta, ich habe einen Dual-Boot, jeder verwendet seine Standardeinstellung ~/.emacs.d/elpa/für den Speicherort von Paketen. Meine Version Ihres Paketinstallationscodes befindet sich jedoch in einer "dritten" Partition ( e:/emacs-configoder /e/emacs-config/). Daher füge ich der Liste unter einem Betriebssystem ein Paket hinzu, das aktualisiert werden sollte, wenn ich es Emacsauf dem anderen Betriebssystem lade . Sicher, meine Lösung enthält ein gewisses Maß an Overkill, aber es scheint zumindest zu funktionieren.
Brady Trainor
@jpkotta, warum mein package-archive-contentsmöglicherweise so verrückt zu sein schien, entgeht mir. Das ist ein Thema, das ich nicht eingegrenzt habe. Wenn ich in Zukunft nach einer "eleganteren" Lösung suche und diese finde, werde ich sie meinem Beitrag hinzufügen.
Brady Trainor
1
(package-refresh-contents)schreibt an ~/.emacs.d/elpa/archives. Es ist nicht klar, ob Sie dieses Verzeichnis zwischen Betriebssystemen gemeinsam genutzt haben. Ich würde empfehlen, die elpa/Verzeichnisse elpa/nicht freizugeben , da der Emacs-Bytecode (Code in ist bytekompiliert) nicht abwärtskompatibel ist ( gnu.org/software/emacs/manual/html_node/elisp/… ). Sie müssen sicherstellen, dass beide Installationen dieselbe Version von Emacs haben. Ich behalte meine .emacs.dVersionskontrolle und synchronisiere damit verschiedene Installationen.
jpkotta