Emacsでのパッケージの更新


144

私はパッケージの次の設定をしています(より良い推奨設定があるかどうかはわかりません):

(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.3追加する順番は関係ありpackage-archivesますか?


13
マーマレードでオートコンプリートを利用できるようにすることを明らかに気にしていないため、オートコンプリートにはMELPAが必要です。気にしないでください、むしろあなたのを片付けてくださいpackage-archives。もはやメンテナンスされていないELPAアーカイブと、明確なガイダンスとメンテナンスのない時代遅れで複製されたパッケージの混乱であるマーマレードアーカイブを削除します。標準のGNUアーカイブとMELPA>のみを使用してください
。– lunaryorn

2
ありがとう@lunaryorn!それはとても役に立ちます。私がこのようなことについて常に情報を得ることができることを知っていますか?(つまり、Emacsが進化するにつれて、これらのような「知っておくべきこと」)
アメリオ・バスケス・レイナ

3
情報はウェブ上を自由に流れ回っています。それをキャッチしてください。Redditで/ emacsをフォローし、Nic Ferrier、Bozhidar Batsov、Magnar Sveen、John Wiegleyなどの有名なEmacsの人々のブログやTwitterをフォローして、Freenode IRCの#emacsに参加してください。などなど。
lunaryorn 2013

3
あなたが自分(setq package-enable-at-startup nil)を呼ぶつもりなら、あなたはすべきです(package-initialize)
フィル、2014年

2
ありがとう@phils-なぜそれが必要なのですか?
Amelio Vazquez-Reina

回答:


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

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

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

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

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

    GNUは「公式」です。これはEmacsとともに維持されます。つまり、常に機能するはずですが、更新や新しいパッケージはそれほど頻繁には提供されません。

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

    Melpaは EmacsWiki lispの面積やGitHubのレポを例えばにURLを取り、自動的にそれからパッケージをビルドします。したがって、追跡しているものは通常、多くても1日遅れています。上流を追跡しますが、実際には問題はありませんでした。これが、ほとんどのパッケージの元です。Melpaと同様ですが、最新のリビジョンではなく、上流のリポジトリのタグ付きリビジョンを取得するMelpa Stableもあります。Melpaの安定版はMelpaよりもパッケージが少ない。

    Orgモードには独自のpackage.elリポジトリがあります(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))))

2
ありがとう!何をwhen (not package-archive-contents)チェックしますか?
Amelio Vazquez-Reina

3
条件式により、emacsを起動するたびに更新が行われなくなります(通常は、指示されたときにのみチェックするようにします)。これは、パッケージアーカイブがないかどうかのみをチェックします。これは、初めて構成を新しいマシンに複製するときにのみ当てはまります。
jpkotta 2013

@Brandy Trainorの回答を知らせてください。これは、役立つ場合に備えて、あなたの回答を補完するようです。
Amelio Vazquez-Reina

(refresh-package-contents)新しいパッケージをダウンロードする前に、これを無条件に呼び出す必要があると思います。そうしないと、Emacsが古いパッケージバージョン(当時は404)をダウンロードしようとして失敗し、ロードを停止する可能性があります。
Vladimir Panteleev 2016

不要なパッケージを理解するための最良の方法は何ですか?@jpkotta
alper

103

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

あなたも見てみたいかもしれません 、専用ファイルでパッケージを宣言してパッケージを管理するためのより便利な方法を提供し、この方法で宣言されたパッケージを自動的にインストールおよびアップグレードするための便利なコマンドラインクライアントが含まカートンをできます。


順序はpackage-archivesありません関係。Emacsは、すべてのアーカイブのコンテンツを、に格納されてpackage-archive-contentsいる利用可能なパッケージとそのバージョンの単一の首尾一貫したリストに集約します。

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


2
それはS-uもっと正確です。
Lenar Hoyt 2015

@mcbとはS-u?パッケージメニューはそのバインディングを使用しません。
lunaryorn 2015年

2
というShift-uことです。
Lenar Hoyt 2015

8
私は首都U😊書いた理由ですまあ、@mcb
lunaryorn

1
これが<kbd> U </ kbd>を意味すると思うのは、私のような混乱した人のためだけです。
Lenar Hoyt 2015

23

ターミナル:

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¢


「U」と入力すると、「コマンドが指定されていません」などのメッセージが表示されました。を実行した後M-x package-refresh-contents、「U」と入力してすべてを更新対象としてマークし、「x」と入力して更新を実行できました。
MrColes

2

これは、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)))。

package-listは、私のユースケースに十分な頻度で更新されていませんでした。

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


私の答えでpackage-archive-contentsは、それが存在しない場合にのみ更新されます。.emacs.dを新しいマシンにコピーすると、すべてのパッケージが自動的にインストールされますが、その後は手動で更新する必要があります。約2週間に1回更新を試みます。あなたpackage-archive-contentsはあなたのリストにパッケージを追加したと思いますが、あなたはそれを手に入れるには古すぎましたか?
jpkotta 2014年

@jpkotta、私はデュアルブートで、それぞれ~/.emacs.d/elpa/がパッケージの場所のデフォルトを使用しています。ただし、私のバージョンのパッケージインストールコードは「3番目」のパーティション(e:/emacs-configまたは/e/emacs-config/)にあります。そのため、一方のOSでパッケージをリストに追加Emacsし、もう一方のOSでロードするとパッケージが更新されるはずです。確かに私の解決策にはやり過ぎの要素がいくつかありますが、少なくともそれは機能しているようです。
ブレイディトレーナー2014年

@jpkotta、どうして私がたまたま無能package-archive-contentsだったように思われたのか、私を逃れました。それは私が絞り込まなかった問題です。将来「よりエレガントな」ソリューションを探して見つけたら、それを投稿に追加します。
ブレイディトレーナー2014年

1
(package-refresh-contents)に書き込みます~/.emacs.d/elpa/archives。OS間でそのディレクトリを共有しているかどうかは明確ではありません。elpa/Emacsバイトコード(コードはバイトコンパイルされelpa/ます)には下位互換性がないため(gnu.org/software/emacs/manual/html_node/elisp/…)、ディレクトリを共有しないことをお勧めします。両方のインストールで同じバージョンのEmacsが使用されていることを確認する必要があります。私は自分の.emacs.dバージョンを管理し、さまざまなインストールをそれと同期しています。
jpkotta 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.