In che modo package-autoremove decide quali pacchetti rimuovere?


11

Durante l'aggiornamento dei miei pacchetti correnti mi viene spesso richiesto di eseguire package-autoremove che afferma di rimuovere pacchetti obsoleti o non necessari. Tuttavia sembra sempre rimuovere (insieme a quei pacchetti obsoleti) due pacchetti che uso (vale a dire aurora-theme, il mio attuale tema di scelta e dired +).

Temo di essere una specie di principiante quando si tratta di Emacs-Lisp e mi stavo solo chiedendo se c'era un modo per fermare l'autoremove pacchetto eliminando questi pacchetti, quindi non avevo bisogno di continuare a reinstallarli.

Risposte:


7

La fonte è qui: https://github.com/emacs-mirror/emacs/blob/master/lisp/emacs-lisp/package.el#L2113 .

Elimina tutti i pacchetti che non si trovano in pacchetti selezionati-pacchetti né una dipendenza.

(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
Quindi questo codice indica che se viene aggiunto un nome di pacchetto package-selected-packages, non verrà rimosso automaticamente.
zck,

@zck Sì. Il pacchetto - rimovibile-pacchetti lo ha fatto.
jiegec,

Vale anche la pena notare che package-selected-packagesviene aggiornato automaticamente quando si installano e rimuovono i pacchetti. In genere non è necessario modificarlo direttamente. Se vedi che le cose vengono rimosse automaticamente, sono probabilmente pacchetti che sono stati inseriti come dipendenze da qualcosa che hai installato e poi rimosso. Oltre a supportare la rimozione automatica, questa variabile può essere utilizzata quando si copia la configurazione di emacs su una nuova macchina e si desidera installare tutto nell'elenco dei pacchetti selezionato, utilizzando package-install-selected-packages.
glucas,

1
@jiegec Il mio punto, scritto male, era che la soluzione al problema dell'utente ("come posso impedire che i pacchetti vengano scritti automaticamente") è "aggiungere i pacchetti a package-selected-packages.
zck

@zck Sì. Hai ragione
Jiegec,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.