แพ็คเกจ autoremove จะตัดสินใจเลือกแพ็คเกจที่จะลบอย่างไร


11

ฉันได้รับแจ้งบ่อยเมื่ออัปเดตแพ็คเกจปัจจุบันของฉันให้เรียกใช้แพคเกจตอบรับอัตโนมัติซึ่งอ้างว่าลบแพ็คเกจที่ล้าสมัยหรือไม่จำเป็นออกไป อย่างไรก็ตามดูเหมือนว่าจะลบ (พร้อมกับแพ็คเกจที่ล้าสมัย) สองแพ็คเกจที่ฉันใช้ (คือออโรร่า - ธีมธีมปัจจุบันของฉันที่เลือกและ dire +)

ฉันกลัวว่าฉันจะเป็นมือใหม่เมื่อพูดถึง 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 จุดของฉันเขียนไม่ดีก็คือการแก้ปัญหาของผู้ใช้ ("ฉันจะป้องกันไม่ให้แพคเกจถูก autoremoved") คือ "เพิ่มแพคเกจไปpackage-selected-packages.
zck

@zck ใช่ คุณพูดถูก
jiegec
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.