Tengo la siguiente configuración para paquetes (no estoy seguro si hay uno mejor recomendado):
(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)
Tengo tres preguntas relacionadas con la instalación y actualización de paquetes.
Q1. ¿Hay alguna manera de actualizar la lista de paquetes disponibles (y las versiones más recientes) y actualizar un paquete específico?
Q.2 ¿Cuál es la diferencia entre las siguientes fuentes de paquetes ?:
- ELPA
- ÑU
- mermelada
- melpa
Q.3 ¿Importa el orden en que se agregan package-archives
?
package-archives
. Deshágase del archivo ELPA, que ya no se mantiene, y del archivo de mermelada, que es un desastre de paquetes obsoletos y duplicados sin orientación y mantenimiento claros. Utilice solo el archivo GNU estándar y MELPA>(setq package-enable-at-startup nil)
si te vas a llamar a(package-initialize)
ti mismo.Respuestas:
Para actualizar automáticamente la lista de paquetes, solo si aún no hay una lista de paquetes , use lo siguiente:
Para actualizar todos los paquetes instalados, escriba
package-list-packages
, que lo llevará al*Packages*
búfer (y también actualizará la lista de paquetes), y luego escriba U x.package-refresh-contents
intenta incondicionalmente descargar una lista de paquetes de todos los repositorios que haya agregadopackage-archives
;package-archive-contents
es nulo si ya ha descargado la lista de paquetes.ELPA es el original. Ya no creo que se mantenga realmente, pero no estoy seguro. No lo uso
GNU es "oficial". Se mantiene junto con Emacs, lo que significa que las cosas siempre deberían funcionar, pero las actualizaciones y los nuevos paquetes no llegan muy a menudo.
Marmalade es básicamente un sitio web donde puede cargar un paquete completo, y se agregará al repositorio de mermelada. No solo envía un enlace a la cadena del paquete, y no automatiza completamente la creación del paquete por completo. Creo que esto es lo correcto, porque no necesariamente desea realizar un seguimiento aguas arriba. Desafortunadamente, no se ha mantenido por un tiempo, pero alguien lo asumió recientemente, por lo que debería estar de regreso y mejorar en algún momento.
Melpa toma una URL para, por ejemplo, el área EmacsWiki lisp o un repositorio github, y crea un paquete automáticamente a partir de ella. Por lo tanto, suele estar a lo sumo un día menos de lo que está rastreando. Aunque rastrea aguas arriba, nunca he tenido un problema en la práctica, y aquí es de donde provienen la mayoría de mis paquetes. También está Melpa Stable , que es como Melpa pero toma revisiones etiquetadas del repositorio ascendente en lugar de la última revisión. Melpa estable tiene menos paquetes que Melpa.
El modo Org tiene su propio
package.el
repositorio ( http://orgmode.org/elpa/ ).Todos los repositorios de paquetes funcionan igual, solo los agrega a su
package-archives
.Aquí hay una publicación de blog más detallada sobre este tema, con la que estoy más de acuerdo.
No estoy seguro, pero creo que si un paquete se duplica en repositorios diferentes, el orden en que aparecen los repos
package-archives
determina la prioridad. No sé si hay mayor prioridad al principio o al final de la lista.Actualización: en Emacs 25, hay una variable
package-archive-priorities
que puede usar para priorizar los repositorios de sus paquetes (por ejemplo, prefiere ELPA sobre MELPA).Aquí está la sección relevante de mi
init.el
, si está interesado:fuente
when (not package-archive-contents)
cheque?(refresh-package-contents)
incondicionalmente antes de descargar nuevos paquetes, ya que de lo contrario Emacs puede intentar descargar una versión anterior del paquete (que para entonces es 404), fallar y dejar de cargar.Dentro de Emacs, use
M-x list-packages
para enumerar todos los paquetes que actualizarán automáticamente el contenido del archivo. Luego, useU
para marcar todos los paquetes actualizables que se actualizarán yx
para realizar las nuevas actualizaciones. Luego, Emacs buscará e instalará todas las actualizaciones, y luego le preguntará si desea eliminar las versiones antiguas y obsoletas.También es posible que desee echar un vistazo a Carton, que proporciona una forma más conveniente de administrar sus paquetes declarándolos en un archivo dedicado e incluye un conveniente cliente de línea de comandos para instalar y actualizar automáticamente los paquetes declarados de esta manera.
El orden de
package-archives
no no importa. Emacs agrega el contenido de todos los archivos en una sola lista coherente de paquetes disponibles y sus versiones, almacenados enpackage-archive-contents
.Luego
package-install
, Emacs simplemente elegirá la versión más reciente de un paquete, independientemente del archivo de origen. Para un mayor control sobre el origen del paquete, MELPA proporciona el paquete melpa que permite incluir paquetes en la lista negra o en la lista blanca desde archivos específicos.fuente
S-u
para ser más preciso.S-u
? El menú del paquete no usa ese enlace.Shift-u
con eso.En terminal:
esto te pone en el búfer * paquetes *
emacs le preguntará (sí / no), espere actualizaciones
esto matará el búfer * paquetes * y lo regresará a * scratch *
esto saldrá de emacs y le permitirá reiniciar vía, pero es posible que deba depurar :(
my 2 ¢
fuente
M-x package-refresh-contents
, me solicitó que escriba "U" para marcar todo para la actualización, y luego pude escribir "x" para ejecutar las actualizaciones.Este es más un comentario extendido sobre la respuesta de jpkotta.
Este es un ajuste con el que estoy experimentando para la respuesta de jpkotta anterior:
(reemplazando
(when (not package-archive-contents) (package-refresh-contents))
).La lista de paquetes no se actualizaba con la frecuencia suficiente para mi caso de uso.
No he considerado si hay una solución más eficiente para mi problema; primero, tengo que ver si el problema desaparece con este ajuste.
fuente
package-archive-contents
se actualiza solo si no existe. La idea es que copie su .emacs.d en una nueva máquina e instale automáticamente todos sus paquetes, pero después de eso debe actualizarlo manualmente. Intento actualizar aproximadamente una vez cada dos semanas. Supongo que agregó un paquete a su lista, pero ¿package-archive-contents
era demasiado viejo para tenerlo?~/.emacs.d/elpa/
para la ubicación de los paquetes. Sin embargo, mi versión de su paquete de código de instalación está en una "tercera" partición, (e:/emacs-config
o/e/emacs-config/
). Entonces agrego un paquete a la lista mientras estoy en un sistema operativo, y debería actualizarse cuando lo cargueEmacs
en el otro sistema operativo. Seguramente hay algún elemento de exageración en mi solución, pero parece estar funcionando al menos.package-archive-contents
parecía estar tan fuera de control se me escapa. Ese es un problema que no limité. Si busco y encuentro una solución "más elegante" en el futuro, la agregaré a mi publicación.(package-refresh-contents)
escribe a~/.emacs.d/elpa/archives
. No está claro si tiene ese directorio compartido entre sistemas operativos. Recomiendo no compartir loselpa/
directorios, porque el código deelpa/
bytes de Emacs (el código está compilado por bytes) no es compatible con versiones anteriores ( gnu.org/software/emacs/manual/html_node/elisp/… ). Debería asegurarse de que ambas instalaciones tengan la misma versión de Emacs. Mantengo mi.emacs.d
control de versiones y sincronizo diferentes instalaciones con eso.