Como o pacote-autoremove decide quais pacotes remover?


11

Sou solicitado com freqüência ao atualizar meus pacotes atuais para executar o pacote autoremove, que afirma remover pacotes desatualizados ou desnecessários. No entanto, sempre parece remover (junto com esses pacotes desatualizados) dois pacotes que eu uso (ou seja, aurora-theme, meu tema atual de escolha e direcionado +).

Eu tenho medo de ser um novato no que se refere ao Emacs-Lisp e eu estava pensando se havia alguma maneira de parar de remover automaticamente os pacotes excluindo esses pacotes, para não precisar reinstalá-los.

Respostas:


7

A fonte está aqui: https://github.com/emacs-mirror/emacs/blob/master/lisp/emacs-lisp/package.el#L2113 .

Exclui todos os pacotes que não estão nos pacotes selecionados nem uma dependência.

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

11
Portanto, esse código significa que, se um nome de pacote for adicionado package-selected-packages, ele não será removido automaticamente.
Zck

@zck Sim. O pacote - pacotes removíveis fez isso.
jiegec

Também é importante notar que package-selected-packagesé atualizado automaticamente quando você instala e remove pacotes. Você geralmente não precisa modificá-lo diretamente. Se você vir as coisas sendo removidas automaticamente, provavelmente os pacotes foram extraídos como dependências de algo que você instalou e depois foram removidos. Além de suportar a remoção automática, essa variável pode ser usada quando você copia sua configuração do emacs para uma nova máquina e deseja instalar tudo na sua lista de pacotes selecionados, usando package-install-selected-packages.
glucas

11
@jiegec Meu ponto, mal escrito, era que a solução para o problema do usuário ( "como posso impedir que os pacotes sejam autoremoved") é "adicionar os pacotes para package-selected-packages.
chave ZCK

@zck Sim. Você está certo
jiegec
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.