La forma más fácil de degradar un paquete instalado a través de MELPA

22

A veces, las actualizaciones de paquetes de MELPA pueden romper parte de emacs y, cuando eso ocurra, me gustaría poder volver a usar una versión anterior del paquete.

En este momento, puedo hacerlo de dos maneras:

  • He configurado emacs para eliminar archivos moviéndome a la papelera y cuando actualizo un paquete, la versión anterior se descarta. Puedo recuperar la versión anterior y reemplazarla ~/.emacs.d/elpa.

  • Vaya al repositorio de github del paquete que rompió la funcionalidad, busque una versión anterior del paquete, reemplace la que está ~/.emacs.d/elpacon la de gitub, vuelva a compilar los archivos.

Ambas formas implican mucho trabajo manual para mover las cosas. ¿Existe una manera más fácil (preferiblemente automática) de degradar los paquetes instalados desde MELPA?

Chakravarthy Raghunandan
fuente
44
Solo puede instalar la última versión a través de ELPA / package.el, Melpa y Melpa-stable ni siquiera mantienen versiones antiguas de paquetes. Para instalar un paquete manualmente, 1) descargue el código fuente 2) M-x package-install-file. También hay otras formas de administrar paquetes además de ELPA / package.el, como el-get y quelpa , parece que pueden usarse sin ELPA, tal vez puedan hacer lo que quieras.
xuchunyang
2
Si no obtiene una respuesta simple y viable a esta pregunta, considere enviar una solicitud de mejora a Emacs: M-x report-emacs-bug(también es para solicitudes de mejora).
Dibujó el

Respuestas:

9

Cuando actualice sus paquetes a través de la M-x list-packagesinterfaz, después de la instalación exitosa del paquete, se le preguntará si desea eliminar el paquete anterior. No los elimine para que permanezcan en su lugar y luego pueda eliminar el paquete más nuevo a través de esta interfaz.

Mi lista de paquetes actual muestra 4 versiones de magit instaladas en mi árbol de directorios ~ / .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

Puede limpiar versiones anteriores más tarde con la clave ~(package-menu-mark-obsolete-for-deletion) para marcar todos los paquetes obsoletos. Para eliminar una cierta versión anterior, muévase a su línea y presione dpara marcarlas para su eliminación. Después de marcar los paquetes que usaría xpara ejecutar las acciones como de costumbre.

En Emacs 25, la marca de todos los paquetes para la Ufuncionalidad pgrade establece automáticamente la eliminación de todos los paquetes antiguos y no solicita confirmación después de la instalación. Debe buscar líneas que comiencen con una "D" mayúscula, que simplemente puede desmarcar (mejor con la siguiente macro)

Escriba la tecla o acorde a la izquierda del guión de las siguientes líneas.

<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

Si no hay más coincidencias para la búsqueda, la macro hará sonar la campana y se detendrá, por lo que podría C-u 0 <F4>desmarcar todos los paquetes marcados para su eliminación. Después de esto, puede xejecutar las instalaciones.

La función que he declarado que ha cambiado en mi comentario tiene que cambiarse de una manera que aún no puedo comprender, ya que es importante que el último bloque (cond) tenga éxito para que no se repita sin parar.

p_wiersig
fuente
Ah, oye, no pide confirmación para eliminar en mis emacs Simplemente elimina el paquete anterior: / creo que solía preguntar en emacs 24? No recuerdo
Chakravarthy Raghunandan
en efecto. Emacs 24 solicita, 25 parece marcar el antiguo para su eliminación y eso activará la ejecución de las marcas. Puede marcar los paquetes para la instalación a mano o desmarcar las eliminaciones o cambiar las (t (package-menu-mark-delete))líneas package-menu--mark-upgrades-1para que la primera línea sea una prueba para una variable de configuración o algo que regrese nilcuando no desee eliminar paquetes antiguos de inmediato
p_wiersig
¿Puede agregar las líneas relevantes para editar en package.ella respuesta original, para que pueda aceptar la respuesta? Gracias
Chakravarthy Raghunandan
Seguro. Noté que no puedo hacer que la función haga lo que quiero, así que le expliqué cómo desmarcar todo a través de una macro.
p_wiersig
7

La "opción nuclear", por así decirlo, sería para deshacerse package.elpor completo y en su lugar utilizar el gestor de paquetes que escribí, straight.el. La ventaja sería que straight.elinstala paquetes clonando sus repositorios Git, lo que hace que sea trivial usar la versión que desee. Además, straight.elproporciona funcionalidad para tratar con archivos de bloqueo de revisión, que le permiten registrar el estado exacto de la configuración de administración de paquetes hasta el más mínimo detalle. Luego, en el caso de una emergencia, simplemente puede revertir todos los paquetes a sus versiones conocidas.

Este tipo de operaciones son, en general, imposibles con package.el, y siempre serán imposibles, debido al diseño general.

En respuesta a su deseo de evitar comprometerse cada vez que actualice sus paquetes, esto no es necesario con straight.el. Me gustaría recomendar escribir un fichero de bloqueo de versión y la comisión de ese cada vez que actualice sus paquetes, ya que hace que sea imposible conseguir nunca en un estado en el que la configuración de Emacs se rompe después de una actualización y que no saben cómo revertir. Pero no tiene que hacer esto, si le gusta vivir la vida al límite.

Radon Rosborough
fuente
4

Encuentro una manera fácil de degradar: administrar su propio archivo melpa.

  1. Clon melpa repo.
  2. Siga la página wiki personalizada del archivo melpa de melpa para eliminar todas las recetas.
  3. Encuentre la confirmación del paquete al que desea reducir la calificación y cree una nueva receta con esa confirmación para el paquete. (vea el archivo Léame de melpa sobre cómo especificar la confirmación)
  4. Ejecutar makepara construir el paquete degradado
  5. Agregue su propio archivo melpa, que puede ser un directorio local, a la package-archiveslista.
  6. Instale el paquete degradado utilizando el menú del paquete. O puede usar package-pinned-packagespara restringir el archivo desde donde se debe descargar el paquete.
chunfengd
fuente
3

Mucha gente elige no enviar paquetes ELPA al control de versiones, pero este es un ejemplo de por qué creo que debería hacerlo.

Revertir cualquier cosa es trivial si todo está comprometido.

Dependiendo del estado de los paquetes ELPA aguas arriba es un riesgo.

phils
fuente
Pero eso significaría que tendría que recordar confirmar cada vez que actualice los paquetes. Eso no es lo que quiero. O ¿hay alguna manera de hacer que emacs se organice automáticamente y confirme los paquetes actualizados cada vez que haga una actualización de paquete?
Chakravarthy Raghunandan
1
No entiendo por qué no quieres que los cambios en tu configuración sean decisiones intencionales. Con respecto a las confirmaciones automáticas, estoy seguro de que podría automatizarse, pero no tengo una solución para eso. Sin embargo, la búsqueda de tales soluciones podría ser productiva.
Phil