Actualizar de forma no interactiva todos los paquetes


Respuestas:


9

No estoy seguro de que esto sea lo que quieres (no sé a qué te refieres con "bajo ciertas condiciones"), pero aquí hay una función que uso para actualizar todos los paquetes sin mostrar el *Packages*búfer, lo que me molesta cuando solo quiero para actualizar paquetes.

(defun package-upgrade-all ()
  "Upgrade all packages automatically without showing *Packages* buffer."
  (interactive)
  (package-refresh-contents)
  (let (upgrades)
    (cl-flet ((get-version (name where)
                (let ((pkg (cadr (assq name where))))
                  (when pkg
                    (package-desc-version pkg)))))
      (dolist (package (mapcar #'car package-alist))
        (let ((in-archive (get-version package package-archive-contents)))
          (when (and in-archive
                     (version-list-< (get-version package package-alist)
                                     in-archive))
            (push (cadr (assq package package-archive-contents))
                  upgrades)))))
    (if upgrades
        (when (yes-or-no-p
               (message "Upgrade %d package%s (%s)? "
                        (length upgrades)
                        (if (= (length upgrades) 1) "" "s")
                        (mapconcat #'package-desc-full-name upgrades ", ")))
          (save-window-excursion
            (dolist (package-desc upgrades)
              (let ((old-package (cadr (assq (package-desc-name package-desc)
                                             package-alist))))
                (package-install package-desc)
                (package-delete  old-package)))))
      (message "All packages are up to date"))))

Esto está bien probado. También evita que aparezcan buffers de compilación.


Agradable. Voy a usar esto con una ligera variación que no aparece antes de actualizar los paquetes.
PythonNut

¿Hay alguna razón particular por la que lo hagas en (y-or-n-p (message ..))lugar de solo (y-or-n-p ...)?
PythonNut

@PythonNut, Bueno, necesito construir un mensaje rápido, no recuerdo por qué lo uso message, parece que también se puede hacer format.
Mark Karpov

Ah, sí. Me refería a usar format. Obviamente no puedes hacerlo sin ningún tipo de interpolación de cadenas.
PythonNut

8

Puede usar la actualización automática de paquetes .

Instalarlo por M-x package-install auto-update-package. Proporciona una función llamada auto-package-update-now. Puede escribir una ifcondición simple y agregarla a su .emacs.

(if your-condition
   (auto-package-update-now))

Hm ... lo tendré en cuenta, pero la idea es intentar reparar automáticamente los paquetes si están rotos. Dependiendo de un paquete, hacerlo es un poco absurdo. :-)
PythonNut

1

El paquete ahora se llama actualización automática del paquete. (Demasiada baja reputación para escribirlo como un comentario en la publicación de Chillar anterior).

(Copiado de su publicación y fusionado con esta respuesta):

Instalarlo por M-x package-install auto-package-update. Proporciona una función llamada auto-package-update-now. Puede escribir una condición if simple y agregarla a su ~/.emacs.

(if your-condition
   (auto-package-update-now))

He editado la respuesta de Chillar para corregir el nombre del paquete, creo que podemos eliminar este.
joelittlejohn
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.