อัพเกรดแพคเกจทั้งหมดโดยไม่โต้ตอบ


13

ฉันต้องการให้ emac ของฉันอัพเกรดแพ็คเกจทั้งหมดโดยอัตโนมัติภายใต้เงื่อนไขบางประการ

วิธีที่ดีที่สุดในการทำเช่นนี้คืออะไร?


นี่คือคำสั่งสำหรับอัปเกรดแพ็คเกจที่ล้าสมัยทั้งหมด: github.com/Malabarba/paradox/blob/2.3.5/paradox.el#L165-L181 (แทนที่ทั้งหมดparadoxด้วยpackage)
xuchunyang

@xuchunyang Ah ฉันเห็นว่าไม่ได้ดูแย่เกินไป หากคุณตอบคำถามนี้ฉันก็ยอมรับมัน
PythonNut

คำตอบ:


9

ฉันไม่แน่ใจว่านี่คือสิ่งที่คุณต้องการ (ฉันไม่รู้ว่าคุณหมายถึงอะไรโดย“ ภายใต้เงื่อนไขบางอย่าง”) แต่นี่คือฟังก์ชั่นที่ฉันใช้ในการอัพเกรดแพ็คเกจทั้งหมดโดยไม่แสดง*Packages*บัฟเฟอร์ซึ่งฉันรู้สึกรำคาญเมื่อฉันต้องการ เพื่ออัพเกรดแพ็คเกจ

(defun package-upgrade-all ()
  "Upgrade all packages automatically without showing *Packages* buffer."
  (interactive)
  (package-refresh-contents)
  (let (upgrades)
    (cl-flet ((get-version (name where)
                (let ((pkg (cadr (assq name where))))
                  (when pkg
                    (package-desc-version pkg)))))
      (dolist (package (mapcar #'car package-alist))
        (let ((in-archive (get-version package package-archive-contents)))
          (when (and in-archive
                     (version-list-< (get-version package package-alist)
                                     in-archive))
            (push (cadr (assq package package-archive-contents))
                  upgrades)))))
    (if upgrades
        (when (yes-or-no-p
               (message "Upgrade %d package%s (%s)? "
                        (length upgrades)
                        (if (= (length upgrades) 1) "" "s")
                        (mapconcat #'package-desc-full-name upgrades ", ")))
          (save-window-excursion
            (dolist (package-desc upgrades)
              (let ((old-package (cadr (assq (package-desc-name package-desc)
                                             package-alist))))
                (package-install package-desc)
                (package-delete  old-package)))))
      (message "All packages are up to date"))))

นี่คือความพยายามอย่างดี นอกจากนี้ยังป้องกันไม่ให้บัฟเฟอร์การคอมไพล์เกิดขึ้น


ดี ฉันจะใช้สิ่งนี้พร้อมกับความหลากหลายที่ไม่ได้แจ้งก่อนอัพเกรดแพ็คเกจ
PythonNut

มีเหตุผลใดบ้างที่ทำให้คุณ(y-or-n-p (message ..))แทนที่จะทำอย่างนั้น(y-or-n-p ...)?
PythonNut

@ PythonNut ดีฉันต้องสร้างข้อความแจ้งฉันไม่จำตอนนี้ทำไมฉันใช้messageดูเหมือนว่ามันสามารถทำได้ด้วยformatเช่นกัน
Mark Karpov

อ่าใช่ formatผมหมายถึงการใช้ เห็นได้ชัดว่าคุณไม่สามารถทำได้หากไม่มีการแก้ไขสตริงใด ๆ
PythonNut

8

คุณสามารถใช้การอัพเดทอัตโนมัติแพ็คเกจได้

M-x package-install auto-update-packageติดตั้งได้โดย auto-package-update-nowมันมีฟังก์ชั่นที่เรียกว่า คุณสามารถเขียนง่ายสภาพและเพิ่มที่ของคุณif.emacs

(if your-condition
   (auto-package-update-now))

หืม ... ฉันจะจำสิ่งนี้ไว้ แต่ความคิดก็คือพยายามแก้ไขแพ็กเกจโดยอัตโนมัติถ้ามันพัง ขึ้นอยู่กับแพคเกจที่จะทำเช่นนั้นเป็นเรื่องไร้สาระ :-)
PythonNut

1

แพ็คเกจนี้เรียกว่าการอัปเดตแพ็คเกจอัตโนมัติ (ชื่อเสียงต่ำเกินไปที่จะเขียนเป็นความคิดเห็นในโพสต์ Chillar ด้านบน)

(คัดลอกมาจากโพสต์ของเขาและรวมเข้ากับคำตอบนี้):

M-x package-install auto-package-updateติดตั้งได้โดย auto-package-update-nowมันมีฟังก์ชั่นที่เรียกว่า ~/.emacsคุณสามารถเขียนง่ายถ้าเงื่อนไขและเพิ่มที่ของคุณ

(if your-condition
   (auto-package-update-now))

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