Emacs

MELPAの package-install で発生する Not found エラーを回避する

More than 3 years have passed since last update.


Not found エラー

MELPAで公開されたパッケージを package install でインストールしている最中に、次のようなエラーが発生してインストールが止まってしまうことがある。

file-error "http://melpa.milkbox.net/packages/XXXXX-2015MMDD.HHMM.el" Not found


対処1

M-x package-refresh-contents

を実行したあとにもう一度 package-install を実行する。これで解決すればめでたしめでたし。


対処2

上記の対処で解決しない場合、原因は (各パッケージにではなく) melpaサーバ にある可能性がある。

list-packages ではまず各パッケージのメタ情報 (http://melpa.org/packages/archive-contents) を取得して一覧を作成する仕組みになっているが、この archive-contents と、実際に公開されているパッケージの間でバージョン情報の不整合がかなり頻繁に発生している。具体的には melpa サーバが提供している archive-contents の更新が遅い。これが Not found エラーの原因である。

list-packages で表示されるバージョン情報と、実際に http://melpa.org に掲載されているバージョン情報を比べてみて、異なっていればこのケースである 1

なので対処法としては 2〜3日後に、メタ情報が更新されたのを見計らってまた改めて package-install を実行する というのが正しい。

ただ、どうしても今インストールしたいというケースはありますね。以下のようにやりましょう。


どうにかインストールする方法


  1. インストールしたいパッケージのバージョンを、http://:/melpa.org で調べる。



  2. (PACKAGE_USER_DIR)/archives/melpa/archive-contents を開く。


    • PACKAGE_USER_DIR はelpaパッケージを格納しているディレクトリパスで、変数 package-user-dir に設定されている。




  3. archive-contents の内容を改竄する。

    例として helm のパッケージ情報は次のような記述になっており、(20150402 2318) というのがバージョンである。

        (helm . [(20150402 2318) ((emacs (24)) (cl-lib (0 5)) (async (1 2))) "Helm is an Emacs incremental and narrowing framework" tar ((:url . "https://emacs-helm.github.io/helm/"))])
    

    これを、melpa.org で調べたものに書き変える。melpa.org で示されたバージョンが 20150404.2303 であれば、

    (helm . [(20150404 2303) ((emacs (24)) (cl-lib (0 5)) (async (1 2))) "Helm is an Emacs incremental and narrowing framework" tar ((:url . "https://emacs-helm.github.io/helm/"))])
    

    とするのが正解。

    編集に失敗しても M-x package-refresh-contents を実行すれば元の (不整合のある) archive-contents に戻せるので気にすんな。



  4. 改竄が終了すればセーブして emacs を再起動。


  5. 再起動後すぐに、M-x package-list-packages-no-fetch を実行。ここから通常通りの操作で最新版がインストールできるようになっているはず。






  1. 頻繁にアップデートされる helm なんかではこの不整合がよく発生することを確認している。