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
?
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>(setq package-enable-at-startup nil)
wenn Sie sich(package-initialize)
selbst anrufen wollen .Antworten:
Verwenden Sie Folgendes, um die Liste der Pakete nur dann automatisch zu aktualisieren, wenn noch keine Paketliste vorhanden ist :
Um alle installierten Pakete zu aktualisieren, geben Sie Folgendes ein,
package-list-packages
um zum*Packages*
Puffer zu gelangen (und aktualisieren Sie auch die Liste der Pakete), und geben Sie dann ein U x.package-refresh-contents
versucht bedingungslos, eine Paketliste von allen Repos herunterzuladen, die Sie hinzugefügt habenpackage-archives
;package-archive-contents
ist nicht gleich Null, wenn Sie die Paketliste bereits heruntergeladen haben.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.el
Repo ( 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.
Ich bin nicht sicher, aber ich denke, wenn ein Paket in verschiedenen Repos dupliziert wird, bestimmt die Reihenfolge, in der die Repos erscheinen,
package-archives
die 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:quelle
when (not package-archive-contents)
prüft?(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.Verwenden Sie
M-x list-packages
in Emacs, um alle Pakete aufzulisten, die den Archivinhalt automatisch aktualisieren. Verwenden Sie anschließendU
diese Option, um alle zu aktualisierenden aktualisierbaren Pakete zu markieren undx
die 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-archives
spielt 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 sindpackage-archive-contents
.Anschließend
package-install
wä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.quelle
S-u
genauer.S-u
? Das Paketmenü verwendet diese Bindung nicht.Shift-u
damit.Im Terminal:
Dies versetzt Sie in den Puffer * packages *
emacs wird Sie fragen (j / n), auf Updates warten
Dadurch wird der * Pakete * -Puffer beendet und Sie kehren zu * Scratch * zurück.
Dadurch werden Emacs beendet und Sie können über neu starten, aber möglicherweise müssen Sie Folgendes debuggen :(
meine 2 ¢
quelle
M-x package-refresh-contents
wurde ich aufgefordert, "U" einzugeben, um alle für die Aktualisierung zu markieren, und dann konnte ich "x" eingeben, um die Aktualisierungen auszuführen.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:
(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.
quelle
package-archive-contents
wird 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 Siepackage-archive-contents
waren zu alt, um es zu haben?~/.emacs.d/elpa/
für den Speicherort von Paketen. Meine Version Ihres Paketinstallationscodes befindet sich jedoch in einer "dritten" Partition (e:/emacs-config
oder/e/emacs-config/
). Daher füge ich der Liste unter einem Betriebssystem ein Paket hinzu, das aktualisiert werden sollte, wenn ich esEmacs
auf dem anderen Betriebssystem lade . Sicher, meine Lösung enthält ein gewisses Maß an Overkill, aber es scheint zumindest zu funktionieren.package-archive-contents
mö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.(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, dieelpa/
Verzeichnisseelpa/
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.d
Versionskontrolle und synchronisiere damit verschiedene Installationen.