web-dev-qa-db-ja.com

Emacsでパッケージを更新する

パッケージには次のセットアップがあります(より適切な推奨パッケージがあるかどうかはわかりません)。

(require 'package)
(setq package-archives '(("ELPA" . "http://tromey.com/elpa/") 
                          ("gnu" . "http://elpa.gnu.org/packages/")
                          ("marmalade" . "http://marmalade-repo.org/packages/")))

; Apparently needed for the package auto-complete (why?)
(add-to-list 'package-archives
             '("melpa" . "http://melpa.milkbox.net/packages/") t)

(package-initialize)
(setq url-http-attempt-keepalives nil)

パッケージのインストールと更新に関する質問が3つあります。

Q1。使用可能なパッケージ(および最新バージョン)のリストを更新し、特定のパッケージを更新する方法はありますか?

Q.2次のパッケージソースの違いは何ですか?:

  • ELPA、
  • GNU
  • マーマレード
  • メルパ

Q.package-archivesに追加される順序は重要ですか?

135
  1. パッケージのリストを自動的に更新するには、パッケージリストがまだない場合のみ、次を使用します。

    (when (not package-archive-contents)
        (package-refresh-contents))
    

    インストールされているすべてのパッケージを更新するには、package-list-packagesと入力します。これにより、*Packages*バッファーに移動し(パッケージのリストも更新します)、次に入力します U x

    package-refresh-contentsは、無条件にpackage-archivesに追加したすべてのリポジトリからパッケージリストをダウンロードしようとします。パッケージリストを既にダウンロードしている場合、package-archive-contentsはnil以外です。

  2. ELPAはオリジナルです。もう本当に維持されているとは思わないが、よく分からない。使用しません。

    GNUは「公式」です。 Emacsと一緒に維持されます。つまり、常に動作するはずですが、更新や新しいパッケージはあまり頻繁には届きません。

    Marmaladeは基本的に完全なパッケージをアップロードできるWebサイトであり、マーマレードリポジトリに追加されます。パッケージのアップストリームへのリンクを送信するだけではなく、パッケージの作成を完全に自動化しません。必ずしもアップストリームを追跡する必要はないため、これは正しいことだと思います。残念ながら、しばらくメンテナンスされていませんでしたが、最近誰かが引き継いでいるので、いつか元に戻してより良いものにする必要があります。

    MelpaはURLを取得します。 EmacsWiki LISPエリアまたはgithubリポジトリ、およびそこからパッケージを自動的にビルドします。したがって、通常、追跡しているものはせいぜい1日遅れています。アップストリームを追跡しますが、実際に問題が発生したことはありません。これが私のパッケージのほとんどの出所です。 Melpa Stableもあります。これはMelpaに似ていますが、最新のリビジョンではなく、タグ付けされたアップストリームリポジトリのリビジョンを取得します。 Melpa stableは、Melpaよりもパッケージが少ないです。

    Org modeには独自のpackage.el repo( http://orgmode.org/elpa/ )があります。

    すべてのパッケージリポジトリは同じように機能し、package-archivesに追加するだけです。

    ここでは、このテーマについてさらに詳しく説明します ブログ投稿

  3. よくわかりませんが、パッケージが異なるリポジトリに複製されている場合、package-archivesにリポジトリが表示される順序が優先順位を決定すると思います。リストの最初と最後のどちらに優先順位が高いのかわかりません。

    更新:Emacs 25には、パッケージリポジトリの優先順位付けに使用できる変数package-archive-prioritiesがあります(MELPAよりもELPAを優先するなど)。


興味があるなら、ここに私のinit.elの関連セクションがあります:

(setq jpk-packages
      '(
        ac-dabbrev
        ...
        yasnippet
        ))

(package-initialize)
(add-to-list 'package-archives
             '("melpa" . "http://melpa.org/packages/"))
(add-to-list 'package-archives
             '("org" . "http://orgmode.org/elpa/"))

;; install any packages in jpk-packages, if they are not installed already
(let ((refreshed nil))
  (when (not package-archive-contents)
    (package-refresh-contents)
    (setq refreshed t))
  (dolist (pkg jpk-packages)
    (when (and (not (package-installed-p pkg))
             (assoc pkg package-archive-contents))
      (unless refreshed
        (package-refresh-contents)
        (setq refreshed t))
      (package-install pkg))))

(defun package-list-unaccounted-packages ()
  "Like `package-list-packages', but shows only the packages that
  are installed and are not in `jpk-packages'.  Useful for
  cleaning out unwanted packages."
  (interactive)
  (package-show-package-list
   (remove-if-not (lambda (x) (and (not (memq x jpk-packages))
                            (not (package-built-in-p x))
                            (package-installed-p x)))
                  (mapcar 'car package-archive-contents))))
153
jpkotta

Emacs内で、M-x list-packagesを使用して、アーカイブの内容を自動的に更新するすべてのパッケージをリストします。その後、Uを使用して、アップグレードするすべてのアップグレード可能パッケージをマークし、xを使用して、実際に新しい更新を実行します。 Emacsはすべてのアップグレードを取得してインストールし、後で古い古いバージョンを削除するかどうかを尋ねます。

また、 Carton をご覧ください。専用ファイルでパッケージを宣言することでパッケージを管理するより便利な方法を提供します。また、こちらです。


package-archivesの順序はnot問題ではありません。 Emacsは、すべてのアーカイブの内容を、package-archive-contentsに格納されている使用可能なパッケージとそのバージョンの単一の一貫したリストに集約します。

package-installが発生すると、Emacsは元のアーカイブに関係なく、単にパッケージの最新バージョンを選択します。パッケージOriginをさらに制御するために、MELPAは melpa package を提供します。これにより、指定されたアーカイブからパッケージをブラックリストまたはホワイトリストに登録できます。

91
lunaryorn

ターミナル内:

emacs

M-x list-packages

これにより、* packages *バッファーに移動します

shift-u x

emacsは(y/n)を尋ね、更新を待つ

C-x k <ret>

これにより、* packages *バッファーが強制終了され、* scratch *に戻ります

C-x-C-c

これはemacsを終了し、経由で再起動させますが、デバッグする必要があるかもしれません:(

emacs

私の2¢

20
rezwits

これは、jpkottaの回答に対する拡張コメントです。

これは、上のjpkottaの答えを試すための調整です。

(setq n 0)                                  ; set n as 0
(dolist (pkg pkgs-2b-present)               ; for each pkg in list
  (unless (or                               ; unless
           (package-installed-p pkg)        ; pkg is installed or
           (assoc pkg                       ; pkg is in the archive list
                  package-archive-contents))
    (setq n (+ n 1))))                      ; add one to n
(when (> n 0)                               ; if n > 0, 
  (package-refresh-contents))               ; refresh packages

(when (not package-archive-contents) (package-refresh-contents))を置き換えます)。

パッケージリストは、ユースケースに十分な頻度で更新されませんでした。

私の問題に対してより効率的な解決策があるかどうかは考えていません。まず、この調整で問題が解決するかどうかを確認する必要があります。

2
Brady Trainor