Comment package-autoremove décide-t-il des packages à supprimer?


11

Je suis fréquemment invité lors de la mise à jour de mes packages actuels à exécuter package-autoremove qui prétend supprimer les packages obsolètes ou inutiles. Cependant, il semble toujours supprimer (avec ces packages obsolètes) deux packages que j'utilise (à savoir aurora-theme, mon thème actuel de choix et dired +).

Je crains d'être un novice en ce qui concerne Emacs-Lisp et je me demandais simplement s'il y avait un moyen d'arrêter la suppression automatique des packages en supprimant ces packages, donc je n'avais pas besoin de continuer à les réinstaller.

Réponses:


7

La source est ici: https://github.com/emacs-mirror/emacs/blob/master/lisp/emacs-lisp/package.el#L2113 .

Il supprime tous les packages qui ne se trouvent pas dans package-selected-packages ni dans une dépendance.

(defun package-autoremove ()
"Remove packages that are no more needed.
        Packages that are no more needed by other packages in
        `package-selected-packages' and their dependencies
        will be deleted."
(interactive)
;; If `package-selected-packages' is nil, it would make no sense to
;; try to populate it here, because then `package-autoremove' will
;; do absolutely nothing.
(when (or package-selected-packages
            (yes-or-no-p
            (format-message
            "`package-selected-packages' is empty! Really remove ALL packages? ")))
    (let ((removable (package--removable-packages)))
    (if removable
        (when (y-or-n-p
                (format "%s packages will be deleted:\n%s, proceed? "
                        (length removable)
                        (mapconcat #'symbol-name removable ", ")))
            (mapc (lambda (p)
                    (package-delete (cadr (assq p package-alist)) t))
                removable))
        (message "Nothing to autoremove")))))

(defun package--removable-packages ()
  "Return a list of names of packages no longer needed.
These are packages which are neither contained in
`package-selected-packages' nor a dependency of one that is."
  (let ((needed (cl-loop for p in package-selected-packages
                         if (assq p package-alist)
                         ;; `p' and its dependencies are needed.
                         append (cons p (package--get-deps p)))))
    (cl-loop for p in (mapcar #'car package-alist)
             unless (memq p needed)
             collect p)))

1
Donc, ce code signifie que si un nom de package est ajouté package-selected-packages, il ne sera pas supprimé automatiquement.
2015

@zck Oui. Le package - packages-amovibles a fait cela.
jiegec

Il convient également de noter qu'il package-selected-packagesest mis à jour automatiquement lorsque vous installez et supprimez des packages. Vous n'avez généralement pas besoin de le modifier directement. Si vous voyez des éléments supprimés automatiquement, il s'agit probablement de packages qui ont été extraits en tant que dépendances de quelque chose que vous avez installé, puis supprimés ultérieurement. En plus de prendre en charge la suppression automatique, cette variable peut être utilisée lorsque vous copiez votre configuration emacs sur une nouvelle machine et souhaitez tout installer dans votre liste de packages sélectionnée, à l'aide de package-install-selected-packages.
glucas

1
@jiegec Mon argument, mal écrit, était que la solution au problème de l'utilisateur ("comment empêcher la suppression automatique des packages") est "ajouter les packages à package-selected-packages.
zck

@zck Oui. Vous avez raison
jiegec
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.