すべてのパッケージを非対話形式でアップグレードします


13

特定の条件下ですべてのパッケージをemacsに自動的にアップグレードさせたい。

これを行う最良の方法は何ですか?


以下は、すべての古いパッケージをアップグレードするためのコマンドです。github.com / Malabarba / paradox / blob / 2.3.5 / paradox.el#L165-L181(すべてparadoxをに置き換えますpackage)。
xuchunyang

@xuchunyangああ。私はそれがあまり悪く見えないのを見ます。あなたがそれを答えにするなら、私はそれを受け入れます。
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
マークカルポフ

ああ、はい。を使用することを意味しましたformat。明らかに、文字列の補間を行わずにそれを行うことはできません。
PythonNut

8

auto-package-updateを使用できます。

でインストールし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。単純なif条件を記述して、それをに追加できます~/.emacs

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

パッケージ名を修正するためにChillarの回答を編集しましたが、これを削除できると思います。
-joelittlejohn
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.