Mutakhirkan semua paket secara tidak interaktif


13

Saya ingin emacs saya memutakhirkan semua paket secara otomatis dalam kondisi tertentu.

Apa cara terbaik untuk melakukan ini?


Ini adalah perintah untuk memutakhirkan semua paket yang sudah usang: github.com/Malabarba/paradox/blob/2.3.5/paradox.el#L165-L181 (ganti semua paradoxdengan package).
xuchunyang

@xuchunyang Ah. Saya melihat itu tidak terlihat terlalu buruk. Jika Anda menjawabnya, saya akan menerimanya.
PythonNut

Jawaban:


9

Saya tidak yakin ini yang Anda inginkan (saya tidak tahu apa yang Anda maksud dengan “dalam kondisi tertentu”), tetapi di sini adalah fungsi yang saya gunakan untuk memutakhirkan semua paket tanpa menunjukkan *Packages*buffer, yang menurut saya menjengkelkan ketika saya hanya ingin untuk meningkatkan paket.

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

Ini sudah dicoba dengan baik. Itu juga mencegah kompilasi buffer muncul.


Bagus. Saya akan menggunakan ini dengan sedikit variasi yang tidak meminta sebelum meningkatkan paket.
PythonNut

Apakah ada alasan khusus mengapa Anda melakukannya, (y-or-n-p (message ..))bukan hanya (y-or-n-p ...)?
PythonNut

@ PhythonNut, Yah saya perlu membangun pesan cepat, saya tidak ingat sekarang mengapa saya menggunakan message, sepertinya itu bisa dilakukan dengan formatbaik juga.
Mark Karpov

Ah iya. Maksud saya menggunakan format. Jelas Anda tidak dapat melakukannya tanpa interpolasi string apa pun.
PythonNut

8

Anda dapat menggunakan pembaruan paket otomatis .

Instal dengan M-x package-install auto-update-package. Ini menyediakan fungsi yang disebut auto-package-update-now. Anda dapat menulis ifkondisi sederhana dan menambahkannya ke .emacs.

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

Hm ... Saya akan mengingat hal ini, tetapi idenya adalah mencoba memperbaiki secara otomatis paket jika mereka rusak. Tergantung pada paket untuk melakukannya agak tidak masuk akal. :-)
PythonNut

1

Paket ini sekarang disebut pembaruan paket otomatis. (Reputasi terlalu rendah untuk menuliskannya sebagai komentar pada posting Chillar di atas).

(Disalin dari jabatannya dan bergabung dengan jawaban ini):

Instal dengan M-x package-install auto-package-update. Ini menyediakan fungsi yang disebut auto-package-update-now. Anda dapat menulis kondisi jika sederhana dan menambahkannya ke ~/.emacs.

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

Saya telah mengedit jawaban Chillar untuk memperbaiki nama paket, kami dapat menghapus yang ini sekarang.
joelittlejohn
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.