package: パッケージ管理ツール

Author: syohex
Published: 2013-09-25
Last Modified: 2020-06-05
GitHub Source: md

概要

package.elについて示す.

インストール

Emacs 24では標準添付されているので, Emacs 24以降を使用している場合は, インストールは不要である.

Emacs 23ユーザーの方

http://bit.ly/pkg-el23から Emacs23向けの package.elをダウンロードし, load-pathの通ったディレクトリに配置してください.

各リポジトリについて

GNU ELPA

公式のリポジトリ. デフォルトの設定では, このリポジトリしか利用することはできない. 登録に手間がかかるためか, 登録されているパッケージ数は少なめであるが, 他の リポジトリに比べると登録されているパッケージの信頼度は高い.

MELPA

非公式のリポジトリ. githubのリポジトリに pull request を送ることで, パッケージを登録することができる. リポジトリに変更がある度に更新されるので, 登録されているパッケージの最新版をインストールすることができる.

MELPA-stable

安定版 MELPA. 最新のリビジョンでなく, 最新のタグのバージョンが取得できる.

推奨されていない. (参考: melpa/melpa - MELPA Stable)

Org

最新版 Org modeのリポジトリ.

リポジトリの登録

package-archives変数(連想リスト)にリポジトリ情報が格納されている. 新規に追加する場合は, この変数を ("リポジトリ名" . "URL")のリストで上書きすればよい.

設定例

(require 'package)

;; package-archivesを上書き
(setq package-archives
      '(("melpa" . "https://melpa.org/packages/")
        ;; ("melpa-stable" . "https://stable.melpa.org/packages/")
        ("org" . "https://orgmode.org/elpa/")
        ("gnu" . "https://elpa.gnu.org/packages/")))

;; 初期化
(package-initialize)

利用方法

M-x package-install

指定したパッケージをインストールする.

M-x package-refresh-contents

パッケージ情報を更新する. 最新のものをインストールしたい場合は, 事前に実行して置くと 良い. 後述の package-list-packagesからインストールを行う場合は不要.

M-x package-list-packages

パッケージ操作バッファを開く.

package-list-packages

package-list-packagesでの操作一覧

キー 概要
`r` パッケージ一覧の更新
`x` マークの実行
`U` Upgrade
`i` インストールマークをつける
`d` 削除マークをつける
`~` 古いパッケージに削除マークをつける
`u` マークを除去する
`?` パッケージの概要を表示
`n` 次の行へ移動
`p` 前の行へ移動
`h` help
`q`, `z` 終了

NOTE

package-list-packagesでは package-refresh-contentsがまず行われるので, パッケージ更新の時間を要する. パッケージ情報が既に更新済み等の場合は, パッケージ情報の更新を行わない package-list-packages-no-fetchを実行すると良い.

MELPAは頻繁に更新が行われているため, 手元のキャッシュが古くなり, インストールに失敗することがよくある. その場合, M-x package-refresh-contents を行った後で再度インストールを実行すると良い.

なお, 後述の leaf を使う場合, この作業を自動で行うので手元のキャッシュが古いことは考えなくて良い.

package.elを使ったパッケージ管理例

package.elを使ったパッケージ管理方法について示す.

(package-installed-p package-name)package-nameがインストール済みで あるかを確認することができるので, package-installed-pnilを返すパッケージを インストールすれば, 同じ環境を構築することができる.

以下のようなファイルを用意し, M-x eval-bufferを実行することで, インストールされて いないパッケージをインストールすることができる.

(require 'package)
(setq package-archives
      '(("melpa" . "https://melpa.org/packages/")
        ("org" . "https://orgmode.org/elpa/")
        ("gnu" . "https://elpa.gnu.org/packages/")))
(package-initialize)

;; パッケージ情報の更新
(package-refresh-contents)

;; インストールするパッケージ
(defvar my/favorite-packages
  '(
    ;;;; for auto-complete
    auto-complete fuzzy popup pos-tip

    ;;;; buffer utils
    popwin elscreen yascroll buffer-move

    ;;;; flymake
    flycheck flymake-jslint

    ;;;; go
    go-mode

    ;;;; python
    jedi

    ;;;; helm
    helm

    ;;;; git
    magit git-gutter
    ))

;; my/favorite-packagesからインストールしていないパッケージをインストール
(dolist (package my/favorite-packages)
  (unless (package-installed-p package)
    (package-install package)))

NOTE

package-installed-p関数はあくまでインストールしているかどうかを 知らせるだけなので, アップグレードできるかどうかを検知できるわけではない.

leafを使ったパッケージ管理例

leaf.el@conao3さんによって開発されたパッケージである. パッケージ設定で良く使われる「イディオム」をラップし, 宣言的にパッケージの設定を行うことができる.

多数のキーワードが実装されているが, この項ではpackage.elに関連するキーワードである:ensureキーワードを解説する.

キャッシュがない場合やキャッシュが古い場合のみ更新を行い, 不必要なパッケージ情報の更新は行わない.

(M)ELPAからインストールしたいパッケージに :ensure t をつける. それだけでleafが適切なS式を生成してくれる.

(eval-and-compile
  (customize-set-variable
   'package-archives '(("org" . "https://orgmode.org/elpa/")
                       ("melpa" . "https://melpa.org/packages/")
                       ("gnu" . "https://elpa.gnu.org/packages/")))
  (package-initialize)
  (unless (package-installed-p 'leaf)
    (package-refresh-contents)
    (package-install 'leaf)))

(leaf auto-complete :ensure t)
(leaf magit
  :ensure t
  :custom ((magit-refresh-verbose . t)))

packageの更新

package-list-packagesを実行し, U, xとすることで, インストール済みの パッケージをすべて upgradeできる.

関連 URL