$shibayu36->blog;

株式会社はてなでエンジニアをしています。プログラミングや読書のことなどについて書いています。

package.elとinit-loader.elの同時利用での問題にハマった

最近elispをpackageとel-get両方で管理する - $shibayu36->blog;で書いたとおり、package.elとel-getで大体の管理をしています。その時にinit-loader周りでハマったことがあったのでメモ。

init-loaderとはemacsでinit-loaderを導入してみた - $shibayu36->blog;で紹介しているとおり、特定ディレクトリを指定しておくとそこから自動的に設定を読み込み、かつエラーが起きた時に起こったファイルの特定などを行なってくれるものです。これを利用することで、init.elにすべての設定を書いたり、設定を分けてloadするみたいなことをしなくて良くなります。

問題と原因

さてpackage.elを利用している時に次の問題が起きました。

  • 特定のelispをインストールしたにもかかわらず、そのelispのインストールディレクトリにload-pathが通らない

いろいろ調べていた結果、自分の使っているinit-loader.elのバージョンが古く、load-path周りに問題があった(原因は完全に特定できていないため実際には不明)ため、load-pathが通ってなかったことがわかりました。

修正

init-loaderはなぜかいろいろforkされていて、いろんなところに散らばっているのでどれを使えばいいかよくわからないのですが、現在はemacs.jpにホストされているものがMELPAに登録されているのでそれを使えばよいでしょう。

まずはinit-loaderをpackage.elでインストール。

M-x package-install init-loader

init-loaderをpackage.el管理にすることにより、package.elのセットアップをinit-loader読み込みより先に行わなければならなくなるので以下のようにinit.elに書く。

(require 'package)
(setq package-user-dir "~/.emacs.d/elisp/elpa/") ;; これは好みに合わせて
(add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/") t)
(package-initialize)

(require 'init-loader)
(init-loader-load "~/.emacs.d/inits") ;; ここも好みに

これでinit-loaderとpackage.elの組み合わせで起こる問題に対処出来ます。

雑感

もともとelispをずっとアップデートしていないのが問題で、それが顕在化したという感じでした。それもこれもこの前までpackage.elなどで管理していなかったのが問題でした。最近は大体package.el管理になり、一括アップデートがすぐ出来るようになったので定期的にアップデートかけたいです。

ただpackage.el管理でのバージョン管理戦略についてまだ考えられていないです。気軽にアップデートしたいけど、何か問題が起こった時にすぐ戻したい、けど今のところバージョン指定によるインストールとか出来ない、などなど。

なかなか難しいですね。