Як пакет-autoremove вирішує, які пакунки видалити?


11

Мені часто пропонується під час оновлення моїх поточних пакетів запускати пакет-autoremove, який вимагає видалити застарілі або непотрібні пакети. Однак завжди видається (разом із застарілими пакетами) два пакунки, якими я користуюсь (а саме тема «Аврора», моя поточна тема вибору та «дірі +»).

Я боюся, що я щось новачкове, коли мова заходить про Emacs-Lisp, і мені було просто цікаво, чи є спосіб, щоб я міг зупинити пакунок, щоб авторемонтувати видалення цих пакунків, тому мені не потрібно було продовжувати їх перевстановлювати.

Відповіді:


7

Джерело тут: https://github.com/emacs-mirror/emacs/blob/master/lisp/emacs-lisp/package.el#L2113 .

Він видаляє всі пакети, які не перебувають у відібраному пакеті, ані в залежності.

(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
Таким чином, цей код означає, що якщо ім'я пакету буде додано package-selected-packages, воно не буде автоматично змінено.
zck

@zck Так. Пакет - знімні пакети зробили це.
jiegec

Також варто зазначити, що package-selected-packagesоновляється автоматично при встановленні та видаленні пакетів. Як правило, не потрібно його безпосередньо змінювати. Якщо ви бачите, що речі видаляються автоматично, це, ймовірно, пакети, які були витягнуті як залежність від встановленого вами, а потім видаленого пізніше. На додаток до підтримки автоматичного видалення, цю змінну можна використовувати, коли ви копіюєте конфігурацію emacs на нову машину і хочете встановити все у вибраному списку пакунків, використовуючи package-install-selected-packages.
глюкас

1
@jiegec Моя думка, погано написана, полягала в тому, що рішення проблеми користувача ("як я запобігти автоматичному переміщенню пакунків") - "додати пакунки до package-selected-packages.
zck

@zck Так. Ви маєте рацію
jiegec
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.