package-autoremove는 제거 할 패키지를 어떻게 결정합니까?


11

구식이거나 불필요한 패키지를 제거한다고 주장하는 package-autoremove를 실행하기 위해 현재 패키지를 업데이트 할 때 자주 메시지가 표시됩니다. 그러나 그것은 항상 (오래된 패키지와 함께) 내가 사용하는 두 가지 패키지 (즉, 오로라 테마, 현재 선택한 테마 및 dired +)를 제거하는 것으로 보입니다.

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.
glucas

1
@jiegec 저의 요점은, 사용자의 문제에 대한 해결책 ( "패키지가 자동으로 제거되는 것을 방지하는 방법")이 "패키지를 다음에 추가하는 것" package-selected-packages입니다.
zck

@zck 예. 당신이 맞아
jiegec
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.