Emacs24で標準となるパッケージ管理システムとその周辺まとめ

Emacs24のリリースも近づきつつある(ソース俺)今日この頃、皆様いかがお過ごしでしょうか。

私はと言いますと、4月から異動で新しい職場となりEmacsの利用頻度がガクーッとさがってしまいました。というわけで、ここ最近Emacsをいぢる機会もあまりなかったのですが、次の記事が目につきまして

It’s just same as dust ahead of a wind: el-get を使って Emacs でパッケージ管理

いやはや、これはだいぶ誤解されているぞ、と。これはいかん(何が)と思い、Emacs24のパッケージ管理システムについて書いておくことにしました。

Emacs24で標準となるパッケージ管理システムとは

Emacs24では、標準でパッケージ管理システムが同梱されます。これはpackage.elにより提供されていて、Emacs23で利用したい時は以下のpackage.elを使うと良いです。

package.el

このパッケージ管理システム、実は結構前からあったにも関わらず、全くパッとしませんでした。

これは一重にパッケージのリポジトリサイトELPAに原因があります。ELPAではパッケージを登録するのに管理者にメールで依頼、というとってもレガシーな手法をとっていて、このため登録するパッケージが全く増えなかったためです。

その間、Emacsには決定打となるパッケージ管理システムがなく、auto-installやel-getなどパッケージ管理システムが乱立することとなってしまいました。

ところが、Emacs24でpackage.elが標準のパッケージ管理システムとなることが決まってからその周辺はかなり賑やかになってきました。ELPAを補完するようなリポジトリサイトができてきたのです。以降ではそのリポジトリサイトを紹介していきます。

Marmalade

MarmaladeはELPAと違い誰でも自由にパッケージの登録ができるリポジトリサイトです。

Marmalade: Spreadable Elisp

以前の日記でもMarmaladeについては詳しく書きました。

Marmaladeはお手軽感が素敵なEmacs Lispのリポジトリサイト
elispリポジトリサイト、Marmaladeの新着情報をRSS化した

Marmaladeの良いところは何といっても誰でも気軽に登録ができるというところですが、他もいろいろとメリットがあります。

例えば、ヘッダー部分に記述することによって、パッケージ間の依存関係も整理することができます。また、Marmalde自体のソースコードも公開されているため、作ろうと思えば、誰でもオレオレMarmaladeを作ることができます。

MELPA

Marmaladeは、確かにお手軽ではあったのですが問題点もありました。バージョン番号などパッケージに必要な情報はEmacsで慣習的に使われるコメントヘッダーからもってくるのですが、この部分が適切に書かれていないと登録することができませんでした。

また、パッケージをアップデートする時は、新しいバージョンをMarmaladeに登録し直す必要があり、開発者にはちょっとばかり面倒でした。

この点をel-getはスマートに解決しています。リポジトリはパッケージのソースコードリポジトリ自体となっており、そのVCSにコミットすることでパッケージもアップデートされることになります。そして、MELPAはel-getのこの特徴をうまく利用したリポジトリといえます。

MELPA

MELPAは、el-get同様パッケージのvcsが登録されていて、コミットされた日付がバージョン番号となります。そのため、MELPAに登録されればパッケージ更新のためにソースコードを改変する必要もありませんし、コミットすることでリポジトリのバージョンも自動的に更新されます。

また、MELPAに登録されているパッケージ自体もel-getライクなrecipeで管理されています。

melpa/recipes at 2253142c4c3c2d771607063b967284b91e7af079 · milkypostman/melpa

というわけで、登録してもらいたいパッケージがあればrecipeを作ってpull reqすると良いです。私も常用しているパッケージをいくつか追加してpull reqしたら、即マージしてもらえました。

Re: Emacs でパッケージ管理

アップデート用のコマンドがありません

最新のpackage.elではすでに実装されています。また、過去のバージョンを残すことでダウングレートすることもできます。

elispの側から一定の方法に則って登録してあげる必要がありますので

MElPAではelispを改変する必要はありません。el-get同様recipeを追加するだけです。

膨大な過去資産が含まれる emacswiki を直接利用できません。

同じくMElPAでは、Emacs wikiのパッケージを登録することができます。

package.elで良いんではないでしょうか

というわけで、今のpackage.elとel-getを比較するとだいたい同様のことはできてしまいます。強いてあげればel-getのafter相当の機能がpackage.elにはありませんが、その辺りはeval-after-loadなりhookシステムを使えば、柔軟に設定できるので、個人的にはあまり魅力的ではありません。

むしろ、package.elには 依存関係も記述できる、インストール用のUIがある、何より 標準(予定)であるというメリットがあります。

てことで、パッケージ管理システムはpackage.elで十分なんではないかなーと思っています。

2012-04-28 追記

el-getについてコメントいただいたので修正しました。