Le moyen le plus simple de rétrograder un package installé via MELPA


22

Parfois, les mises à jour de packages de MELPA peuvent casser une partie d'emacs et lorsque cela se produit, j'aimerais pouvoir revenir à l'utilisation d'une ancienne version du package.

En ce moment, je peux le faire de deux manières:

  • J'ai défini emacs pour supprimer des fichiers en passant à la corbeille et lorsque je mets à jour un package, l'ancienne version est mise à la corbeille. Je peux récupérer l'ancienne version et remplacer celle de ~/.emacs.d/elpa.

  • Accédez au référentiel github du package qui a cassé la fonctionnalité, récupérez une version plus ancienne du package, remplacez celle-ci ~/.emacs.d/elpapar celle de gitub, recompilez les fichiers en octets.

Ces deux méthodes impliquent beaucoup de travail manuel pour déplacer les choses. Existe-t-il un moyen plus simple (de préférence automatique) de rétrograder les packages installés à partir de MELPA?


4
Vous pouvez uniquement installer la dernière version via ELPA / package.el, Melpa et Melpa-stable ne conservent même pas les anciennes versions des packages. Pour installer un package manuellement, 1) téléchargez le code source 2) M-x package-install-file. Il existe également d'autres façons de gérer les packages en plus de ELPA / package.el, tels que el-get et quelpa , ils semblent pouvoir être utilisés sans ELPA, peut-être qu'ils peuvent faire ce que vous voulez.
xuchunyang

2
Si vous n'obtenez pas de réponse simple et réalisable à cette question, pensez à envoyer une demande d'amélioration à Emacs: M-x report-emacs-bug(c'est aussi pour les demandes d'amélioration).
attiré

Réponses:


9

Lorsque vous mettez à jour vos packages via l' M-x list-packagesinterface, après l'installation réussie du package, il vous sera demandé si vous souhaitez supprimer l'ancien package. Ne les supprimez pas pour qu'ils restent en place et vous pourrez ensuite supprimer le package le plus récent via cette interface.

Ma liste de paquets actuelle montre 4 versions de magit installées dans mon arborescence de répertoires ~ / .emacs.d / elpa /.

  magit              20160827.1549 obsolete              A Git porcelain inside Emacs
  magit              20160907.945  obsolete              A Git porcelain inside Emacs
  magit              20161001.1454 obsolete              A Git porcelain inside Emacs
  magit              20161123.617  installed             A Git porcelain inside Emacs

Vous pouvez nettoyer les anciennes versions plus tard avec la clé ~(package-menu-mark-obsolete-for-deletion) pour marquer tous les packages obsolètes. Pour supprimer une certaine ancienne version, déplacez-vous sur sa ligne et appuyez sur dpour les marquer pour suppression. Après avoir marqué les packages que vous utiliseriez xpour exécuter les actions comme d'habitude.

Dans Emacs 25, la marque tous les packages pour la Ufonctionnalité pgrade définit automatiquement tous les anciens packages pour la suppression et ne demande pas de confirmation après l'installation. Vous devez rechercher les lignes qui commencent par un "D" majuscule, que vous pouvez simplement décocher (mieux avec la macro suivante)

Tapez la clé ou l'accord à gauche du tiret à partir des lignes suivantes.

<F3>  - start macro recording
C-s   - isearch-forward
C-q   - quoted-insert
C-j   - linefeed character
D     - the mark at the start of the line
<Ret> - stops the isearch on the line with the "D"
u     - unmark the package for deletion
<F4>  - stops macro recording - the first package is now unmarked
<F4>  - executes the macro for the next upgraded package

S'il n'y a pas d'autres correspondances pour la recherche, la macro sonnera et s'arrêtera, vous pouvez C-u 0 <F4>donc décocher tous les packages marqués pour suppression. Après cela, vous pouvez xexécuter les installations.

La fonction que j'ai déclarée modifiée dans mon commentaire doit être modifiée d'une manière que je ne peux pas encore comprendre, car il est important que le dernier bloc (cond) soit réussi afin de ne pas boucler sans fin.


Oh hé, il ne demande pas de confirmation pour supprimer dans mes emacs. Il supprime simplement l'ancien paquet: / je pense qu'il demandait dans emacs 24? je ne me souviens pas
Chakravarthy Raghunandan

En effet. Emacs 24 invite, 25 semble marquer l'ancien pour la suppression et cela se déclenchera lors de l'exécution des marques. Vous pouvez marquer les packages pour l'installation à la main ou décocher les suppressions ou modifier les (t (package-menu-mark-delete))lignes package-menu--mark-upgrades-1afin que la première ligne soit un test pour une variable de configuration ou quelque chose qui retourne nillorsque vous ne souhaitez pas supprimer immédiatement les anciens packages
p_wiersig

Pouvez-vous s'il vous plaît ajouter les lignes pertinentes à modifier dans package.ella réponse d'origine, afin que je puisse accepter la réponse? Merci
Chakravarthy Raghunandan

Sûr. J'ai remarqué que je ne peux pas faire en sorte que la fonction fasse ce que je veux, alors j'ai expliqué comment tout décocher via une macro.
p_wiersig

7

La « option nucléaire », pour ainsi dire, serait de fossé package.elentièrement et utiliser plutôt le gestionnaire de paquets que je l' ai écrit, straight.el. L'avantage serait d' straight.elinstaller les packages en clonant leurs référentiels Git, ce qui rendrait trivial l'utilisation de la version que vous souhaitez. straight.elFournit également des fonctionnalités pour gérer les fichiers de verrouillage de révision, qui vous permettent d'enregistrer l'état exact de votre configuration de gestion des packages dans les moindres détails. Ensuite, en cas d'urgence, vous pouvez simplement rétablir tous les packages dans leurs versions connues.

Ces types d'opérations sont, en général, impossibles avec package.el, et elles seront toujours impossibles, en raison de la conception globale.

En réponse à votre désir d'éviter de faire un commit à chaque fois que vous mettez à jour vos packages, cela n'est pas nécessaire avec straight.el. Je recommanderais d' écrire un fichier de verrouillage de version et de le valider chaque fois que vous mettez à jour vos packages, car cela rend impossible de se retrouver dans un état où votre configuration Emacs est rompue après une mise à niveau et vous ne savez pas comment revenir. Mais vous n'avez pas à le faire si vous aimez vivre la vie à la limite.


4

Je trouve un moyen simple de rétrograder: la gestion de votre propre archive melpa.

  1. Clone melpa repo.
  2. Suivez la page wiki d'archive melpa personnalisée de melpa pour supprimer toutes les recettes.
  3. Recherchez le commit du package auquel vous souhaitez réduire la note et créez une nouvelle recette avec ce commit pour le package. (voir le fichier Lisez - moi de melpa sur la façon de spécifier le commit)
  4. Exécutez makepour construire le package déclassé
  5. Ajoutez votre propre archive melpa, qui peut être un répertoire local, à la package-archivesliste.
  6. Installez le package déclassé à l'aide du menu du package. Ou vous pouvez utiliser package-pinned-packagespour restreindre l'archive à partir de laquelle le package doit être téléchargé.

3

Beaucoup de gens choisissent de ne pas valider les packages ELPA pour le contrôle de version, mais c'est un exemple de la raison pour laquelle je pense que vous devriez le faire.

Inverser quoi que ce soit est trivial si tout est engagé.

Dépendre de l'état des colis ELPA en amont est un risque.


Mais cela signifierait que je dois me rappeler de valider chaque fois que je mets à jour des packages. Ce n'est pas ce que je veux. OU existe-t-il un moyen de faire en sorte qu'emacs organise automatiquement et valide les packages mis à jour chaque fois que je fais une mise à jour de package?
Chakravarthy Raghunandan

1
Je ne comprends pas pourquoi vous ne voudriez pas que les modifications de votre configuration soient des décisions intentionnelles. En ce qui concerne les validations automatiques, je suis sûr que cela pourrait être automatisé, mais je n'ai pas de solution pour cela. Cependant, la recherche de telles solutions peut être productive.
phils
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.