Mettre à niveau de manière non interactive tous les packages


13

Je veux que mon emacs mette automatiquement à niveau tous les packages sous certaines conditions.

Quelle est la meilleure façon de procéder?


Voici une commande pour mettre à niveau tous les packages obsolètes: github.com/Malabarba/paradox/blob/2.3.5/paradox.el#L165-L181 (remplacez tous paradoxpar package).
xuchunyang

@xuchunyang Ah. Je vois que ça n'a pas l'air trop mal. Si vous en faites une réponse, je l'accepterais.
PythonNut

Réponses:


9

Je ne suis pas sûr que c'est ce que vous voulez (je ne sais pas ce que vous entendez par «sous certaines conditions»), mais voici une fonction que j'utilise pour mettre à niveau tous les paquets sans afficher de *Packages*tampon, ce que je trouve ennuyeux quand je veux juste pour mettre à niveau les packages.

(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"))))

C'est bien essayé. Il empêche également l'apparition de tampons de compilation.


Agréable. Je vais l'utiliser avec une légère variation qui ne demande pas avant de mettre à niveau les packages.
PythonNut

Y a-t-il une raison particulière pour laquelle vous le faites (y-or-n-p (message ..))au lieu de simplement (y-or-n-p ...)?
PythonNut du

@PythonNut, Eh bien, j'ai besoin de construire un message rapide, je ne me souviens plus maintenant pourquoi j'utilise message, il semble que cela puisse être fait formataussi bien.
Mark Karpov

Ah oui. Je voulais dire utiliser format. De toute évidence, vous ne pouvez pas le faire sans aucune sorte d'interpolation de chaînes.
PythonNut

8

Vous pouvez utiliser la mise à jour automatique des packages .

Installez-le par M-x package-install auto-update-package. Il fournit une fonction appelée auto-package-update-now. Vous pouvez écrire une ifcondition simple et l'ajouter à votre .emacs.

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

Hm ... Je garderai cela à l'esprit, mais l'idée est d'essayer de réparer automatiquement les paquets emballés s'ils sont cassés. Dépendre d'un package est un peu absurde. :-)
PythonNut

1

Le package est maintenant appelé mise à jour automatique du package. (Réputation trop faible pour l'écrire en commentaire du post Chillar ci-dessus).

(Copié de son poste et fusionné avec cette réponse):

Installez-le par M-x package-install auto-package-update. Il fournit une fonction appelée auto-package-update-now. Vous pouvez écrire une condition if simple et l'ajouter à votre ~/.emacs.

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

J'ai édité la réponse de Chillar pour corriger le nom du paquet, nous pouvons supprimer celui-ci maintenant je pense.
joelittlejohn
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.