Il modo più semplice per eseguire il downgrade di un pacchetto installato tramite MELPA


22

A volte, gli aggiornamenti del pacchetto da MELPA possono interrompere alcune parti di emacs e quando ciò accade, vorrei poter tornare a utilizzare una versione precedente del pacchetto.

In questo momento, posso farlo in due modi:

  • Ho impostato emacs per eliminare i file spostandoli nel cestino e quando aggiorno un pacchetto, la versione precedente viene eliminata. Posso recuperare la versione precedente e sostituire quella in ~/.emacs.d/elpa.

  • Vai al repository github del pacchetto che ha interrotto la funzionalità, recupera una versione precedente del pacchetto, sostituisci quella in ~/.emacs.d/elpacon quella da gitub, ricompila byte i file.

Entrambi questi modi comportano un sacco di lavoro manuale per spostare le cose. Esiste un modo più semplice (preferibilmente automatico) per eseguire il downgrade dei pacchetti installati da MELPA?


4
Puoi installare l'ultima versione solo tramite ELPA / package.el, Melpa e Melpa-stable non mantengono nemmeno le vecchie versioni dei pacchetti. Per installare un pacchetto manualmente, 1) scarica il codice sorgente 2) M-x package-install-file. Esistono anche altri modi per gestire i pacchetti oltre a ELPA / package.el, come el-get e quelpa , sembrano essere in grado di usare senza ELPA, forse possono fare quello che vuoi.
xuchunyang,

2
Se non ottieni una risposta semplice e fattibile a questa domanda, ti preghiamo di considerare di inviare una richiesta di miglioramento a Emacs: M-x report-emacs-bug(è anche per le richieste di miglioramento).
Disegnato il

Risposte:


9

Quando aggiorni i tuoi pacchetti attraverso l' M-x list-packagesinterfaccia, dopo la corretta installazione del pacchetto, ti verrà chiesto se vuoi rimuovere il vecchio pacchetto. Non eliminarli in modo che rimangano al loro posto e successivamente sarà possibile rimuovere il pacchetto più recente tramite questa interfaccia.

Il mio attuale elenco di pacchetti mostra 4 versioni di magit installate nella mia struttura di directory ~ / .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

È possibile ripulire le versioni precedenti in un secondo momento con la chiave ~(pacchetto-menu-contrassegno-obsoleto-per-cancellazione) per contrassegnare tutti i pacchetti obsoleti. Per eliminare una determinata versione precedente, spostati sulla sua riga e premi dper contrassegnarli per l'eliminazione. Dopo aver contrassegnato i pacchetti che useresti xper eseguire le azioni come al solito.

In Emacs 25, contrassegnare tutti i pacchetti per la Ufunzionalità di aggiornamento imposta automaticamente tutti i vecchi pacchetti per l'eliminazione e non richiede conferma dopo l'installazione. Devi cercare le linee che iniziano con la "D" maiuscola, che puoi semplicemente deselezionare (meglio con la seguente macro)

Digitare la chiave o l'accordo a sinistra del trattino dalle seguenti righe.

<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

Se non ci sono ulteriori corrispondenze per la ricerca, la macro suonerà il campanello e si fermerà, quindi è possibile C-u 0 <F4>deselezionare tutti i pacchetti contrassegnati per l'eliminazione. Successivamente è possibile xeseguire l'installazione delle installazioni.

La funzione che ho dichiarato essere cambiata nel mio commento deve essere cambiata in un modo che non riesco ancora a comprendere, poiché è importante che l'ultimo blocco (cond) debba avere successo per non essere ripetuto all'infinito.


Oh hey, non chiede conferma per cancellare nel mio emacs. Elimina solo il vecchio pacchetto: / penso che fosse solito chiedere in emacs 24? non ricordo
Chakravarthy Raghunandan,

infatti. Emacs 24 richiede, 25 sembra contrassegnare il vecchio per l'eliminazione e ciò si innescherà quando si eseguono i segni. È possibile contrassegnare manualmente i pacchetti per l'installazione o deselezionare le eliminazioni o modificare le (t (package-menu-mark-delete))righe in package-menu--mark-upgrades-1modo che la prima riga sia un test per una variabile di configurazione o qualcosa che ritorni nilquando non si desidera eliminare immediatamente i vecchi pacchetti
p_wiersig

Potete per favore aggiungere le righe pertinenti da modificare nella package.elrisposta originale, in modo che io possa accettare la risposta? Grazie
Chakravarthy Raghunandan il

Sicuro. Ho notato che non posso fare in modo che la funzione faccia quello che voglio, quindi ho spiegato come deselezionare tutto tramite una macro.
p_wiersig,

7

L ' "opzione nucleare", per così dire, sarebbe quello di abbandonare package.eldel tutto e invece utilizzare il gestore di pacchetti che ho scritto, straight.el. Il vantaggio sarebbe che straight.elinstalla i pacchetti clonando i loro repository Git, rendendo così banale l'uso di qualsiasi versione desideri. Inoltre, straight.elfornisce funzionalità per gestire i lockfile di revisione, che consentono di registrare lo stato esatto della configurazione di gestione dei pacchetti fin nei minimi dettagli. Quindi, in caso di emergenza, puoi semplicemente ripristinare tutti i pacchetti nelle loro versioni note.

Questi tipi di operazioni sono, in generale, impossibili con package.el, e saranno sempre impossibili, a causa del design complessivo.

In risposta al tuo desiderio di evitare di impegnarti ogni volta che aggiorni i tuoi pacchetti, questo non è necessario straight.el. Vorrei raccomandare a scrivere un file di lock versione e commettere che ogni volta che si aggiorna i pacchetti, dal momento che rende impossibile ottenere mai in uno stato in cui la configurazione di Emacs è rotto dopo un aggiornamento e non si sa come ripristinare. Ma non devi farlo, se ti piace vivere la vita al limite.


4

Trovo un modo semplice per effettuare il downgrade: gestire il proprio archivio melpa.

  1. Clone melpa repo.
  2. Segui la pagina wiki dell'archivio melpa personalizzato di melpa per rimuovere tutte le ricette.
  3. Trova il commit del pacchetto che desideri sottovalutare e crea una nuova ricetta con quel commit per il pacchetto. (vedi il file Leggimi di melpa su come specificare il commit)
  4. Esegui makeper compilare il pacchetto declassato
  5. Aggiungi il tuo archivio melpa, che può essere una directory locale, package-archivesall'elenco.
  6. Installa il pacchetto declassato usando il menu del pacchetto. Oppure puoi usare package-pinned-packagesper limitare l'archivio da cui scaricare il pacchetto.

3

Molte persone scelgono di non impegnare i pacchetti ELPA per il controllo delle versioni, ma questo è un esempio del motivo per cui credo che dovresti farlo.

Il ripristino di qualsiasi cosa è banale se è tutto impegnato.

A seconda dello stato dei pacchetti ELPA a monte c'è un rischio.


Ciò significherebbe che dovrei ricordare di impegnarmi ogni volta che aggiorno i pacchetti. Non è quello che voglio. O c'è un modo in cui posso fare in modo che emacs metta in scena automaticamente e commetta i pacchetti aggiornati ogni volta che faccio un aggiornamento del pacchetto?
Chakravarthy Raghunandan,

1
Non capisco perché non vorresti che le modifiche alla tua configurazione fossero decisioni intenzionali. Per quanto riguarda gli commit automatici, sono sicuro che potrebbe essere automatizzato, ma non ho una soluzione per questo. La ricerca di tali soluzioni potrebbe tuttavia fornire risultati produttivi.
phils,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.