Manchmal können Paketaktualisierungen von MELPA einen Teil von Emacs beschädigen, und wenn dies passiert, möchte ich wieder auf eine ältere Version des Pakets zurückgreifen können.
Im Moment kann ich das auf zwei Arten tun:
Ich habe den Emacs so eingestellt, dass er Dateien löscht, indem er in den Papierkorb verschoben wird. Wenn ich ein Paket aktualisiere, wird die ältere Version in den Papierkorb verschoben. Ich kann die ältere Version abrufen und die in ersetzen
~/.emacs.d/elpa
.Gehen Sie zum Github-Repo des Pakets, das die Funktionalität
~/.emacs.d/elpa
unterbrochen hat, rufen Sie eine ältere Version des Pakets ab, ersetzen Sie die in-Version durch die aus Github, und kompilieren Sie die Datei (en) per Byte-Neukompilierung.
Beide Methoden erfordern viel manuelle Arbeit, um Dinge zu bewegen. Gibt es eine einfachere (vorzugsweise automatische) Möglichkeit, von MELPA installierte Pakete herunterzustufen?
quelle
M-x package-install-file
. Neben ELPA / package.el gibt es auch andere Möglichkeiten zum Verwalten von Paketen, z. B. el-get und quelpa . Diese scheinen ohne ELPA verwendet zu werden zu können. Vielleicht können sie tun, was Sie wollen.M-x report-emacs-bug
( Dies gilt auch für Erweiterungsanforderungen.)Antworten:
Wenn Sie Ihre Pakete über die
M-x list-packages
Benutzeroberfläche aktualisieren, werden Sie nach der erfolgreichen Installation des Pakets gefragt, ob Sie das alte Paket entfernen möchten. Löschen Sie sie nicht, damit sie an ihrem Platz bleiben und Sie das neuere Paket später über diese Schnittstelle entfernen können.Meine aktuelle Paketliste enthält 4 Versionen von magit, die in meinem Verzeichnisbaum ~ / .emacs.d / elpa / installiert sind.
Sie können alte Versionen später mit dem Schlüssel
~
(Paketmenü-Veraltete zum Löschen markieren) bereinigen , um alle veralteten Pakete zu markieren. Um eine bestimmte alte Version zu löschen, gehen Sie zu ihrer Zeile und drücken Sied
, um sie zum Löschen zu markieren. Nachdem Sie die Pakete markiert habenx
, führen Sie die Aktionen wie gewohnt aus.In Emacs 25 werden durch das Markieren aller Pakete für die
U
pgrade-Funktion automatisch alle alten Pakete zum Löschen festgelegt, und nach der Installation werden Sie nicht zur Bestätigung aufgefordert. Sie müssen nach Zeilen suchen, die mit einem Großbuchstaben "D" beginnen und die Sie einfach entfernen können (am besten mit dem folgenden Makro)Geben Sie die Tonart oder den Akkord links vom Bindestrich in den folgenden Zeilen ein.
Wenn es keine weiteren Übereinstimmungen für die Suche gibt, läutet das Makro und stoppt, sodass Sie die
C-u 0 <F4>
Markierung aller zum Löschen markierten Pakete aufheben können. Danach könnenx
Sie die Installationen durchführen.Die Funktion, die ich in meinem Kommentar als geändert deklariert habe, muss auf eine Weise geändert werden, die ich noch nicht erfassen kann, da es wichtig ist, dass der letzte (cond) Block erfolgreich ist, um keine Endlosschleife auszuführen.
quelle
(t (package-menu-mark-delete))
Zeilenpackage-menu--mark-upgrades-1
so ändern , dass die erste Zeile ein Test für eine Konfigurationsvariable ist oder etwas zurückgibt,nil
wenn Sie alte Pakete nicht sofort löschen möchtenpackage.el
die ursprüngliche Antwort einfügen, damit ich die Antwort akzeptieren kann? DankeDie "nukleare Option" wäre sozusagen,
package.el
ganz aufzugeben und stattdessen den Paketmanager zu verwenden, den ich geschrieben habestraight.el
. Der Vorteil wäre, dassstraight.el
Pakete installiert werden, indem ihre Git-Repositorys geklont werden, wodurch es trivial wird, die gewünschte Version zu verwenden. Außerdemstraight.el
bietet Funktionen für die Revision Lock - Dateien handelt, die Ihnen erlauben , den genauen Status Ihrer Paketverwaltung Konfiguration aufzeichnen bis ins kleinste Detail. Im Notfall können Sie dann einfach alle Pakete auf ihre als funktionierend bekannten Versionen zurücksetzen.Diese Art von Operationen ist im Allgemeinen mit unmöglich
package.el
, und sie werden aufgrund der Gesamtkonstruktion immer unmöglich sein.Dies ist nicht erforderlich, um zu vermeiden, dass Sie jedes Mal ein Commit ausführen, wenn Sie Ihre Pakete aktualisieren
straight.el
. Ich würde empfehlen , eine Versionssperrdatei zu schreiben und diese jedes Mal zu bestätigen, wenn Sie Ihre Pakete aktualisieren, da dies es unmöglich macht, jemals in einen Zustand zu geraten, in dem Ihre Emacs-Konfiguration nach einem Upgrade beschädigt ist und Sie nicht wissen, wie Sie zurücksetzen sollen. Aber Sie müssen das nicht tun, wenn Sie das Leben am Rande leben möchten.quelle
Ich finde einen einfachen Weg, ein Downgrade durchzuführen: Verwalten Ihres eigenen Melpa-Archivs.
make
, um das heruntergestufte Paket zu erstellenpackage-archives
Liste Ihr eigenes Melpa-Archiv hinzu, das ein lokales Verzeichnis sein kann .package-pinned-packages
das Archiv einschränken, von dem das Paket heruntergeladen werden soll.quelle
Viele Leute entscheiden sich dafür, ELPA-Pakete nicht zur Versionskontrolle zu verpflichten, aber dies ist ein Beispiel dafür, warum Sie dies meines Erachtens tun sollten.
Zurückkehren alles ist trivial , wenn es begangen wird .
Je nach Zustand der vorgelagerten ELPA-Pakete besteht ein Risiko.
quelle