164

パッケージには次のセットアップがあります(より推奨されるものがあるかどうかはわかりません):

(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次のパッケージ ソースの違いは何ですか?:

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

Q.3追加する順番は関係ありpackage-archivesますか?

4

4 に答える 4

177
  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 よりもパッケージが少なくなっています。

    組織モードには独自の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))))
于 2013-02-12T17:21:35.297 に答える
117

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

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


の順番はpackage-archives問いませ。Emacs は、すべてのアーカイブの内容を、利用可能なパッケージとそのバージョンの 1 つの首尾一貫したリストに集約し、package-archive-contents.

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

于 2013-02-12T17:59:20.673 に答える
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)))。

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

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

于 2014-03-10T09:45:18.350 に答える