Emacsのパッケージとarchive-contentsをpackage-buildを使って作成した。 また作成時のファイルの配置場所などの設定を確認した。

何をしたいのか

Emacsのパッケージがインストールされるのを眺めるM-x package-refresh-contents した時にどのようなファイルを取得しているのかを確認した。 その中でインデックス情報であるarchive-contentsや署名である.sigなどのファイルをダウンロードしていた。 このarchive-contentsはではどのようにして作成すればよいのだろうか。 今回はmelpaが管理しているpackage-buildというパッケージを使って自分のパッケージを作成し、合わせてarchive-contentsも作成する。

パッケージ化するソースコード

今回はパッケージ化することが目的なので特に何も機能を持たないソースコードを準備した。 https://github.com/sximada/testing にはtesting.elとREADME.orgいうファイルが用意されている。 testing.elには設定に最小限必要な(パッケージを作る過程でエラーにならないようにするもの)ものだけを記述した。 README.orgはパッケージ化に必要なものではないが便宜上配置した。

;;; testing.el --- Testing  -*- lexical-binding:t -*-
;; Version: 201905.01

(provide 'testing)

;;; testing.el ends here
testing.el

なおもっと詳しいパッケージの作り方についてはhttps://www.emacswiki.org/emacs/MakingPackagesを読むと良い。

関連ファイルの出力先の設定

今回はpackage-buildを使ってパッケージ化を行う。 その際に関連するファイルの配置場所を変数で指定できる。

変数 備考 変数の値がnilの場合の対象となるディレクトリ
package-build-working-dir パッケージ化するリポジトリをcloneするところ ~/.emacs.d/elpa/working
package-build-archive-dir パッケージをおくところ ~/.emacs.d/elpa/packages
package-build-recipes-dir レシピを置くところ ~/.emacs.d/elpa/recipes

※ package-build–melpa-baseは~/.emacs.d/meplaと仮定。

参考までにpackage-build–melpa-baseは以下のように定義されている。

(defconst package-build--melpa-base
  (file-name-directory
   (directory-file-name
    (file-name-directory (or load-file-name (buffer-file-name))))))

(defgroup package-build nil

デフォルトの設定ではレシピの配置場所やソースのダウンロード場所が上記の位置になる。 今回はそれらのディレクトリを便宜上変更したいため次ように設定した。

(setq package-build-working-dir "/srv/sximada")
(setq package-build-recipes-dir "/srv/sximada/cubelpa/recipe")
(setq package-build-archive-dir "/srv/sximada/cubelpa-repo/packages")

レシピを作成する

M-x package-build-create-recipe を実行するとミニバッファが開き Package name: が表示される。 ここには作成するパッケージ名を入力する。 入力した名前でレシピのバッファが作成される。 レシピに適切な値を設定し C-c C-c するとpackage-build-archive-dirにレシピが保存され、パッケージのソースコードがpackage-build-working-dirに取得される。

./package-testing.gif
package-build-create-recipeの実行例

取得が終わるとインストールするかどうかを尋ねてくる。 y を入力するとインストールされる。

./package-testing-install.gif
次の画面

パッケージを作る

ここまで実施するとパッケージ対象のソースコードが取得されていて、新しいレシピtestingが作られています。 M-x package-build-archive を実行するとミニバッファにパッケージを選択する内容が表示されます。パッケージを選択するとpackage-build-recipes-dirにパッケージ関連のファイルが作成されます。

ファイル名 内容
archive-contents パッケージのインデックス
testing-20190521.1402.el パッケージの実体
testing-20190521.1402.entry パッケージのインデックスの1行になる値

M-x package-build-all を実行するとpackage-build-archive-dir配下にある.entryファイルを収集してarchive-contentsが更新されます。

まとめ

今回はbuild-packageを使ってパッケージを実際に作りながら以下を確認しました。

  • 次のコマンドを使ってレシピ/パッケージの作成ができる

    • package-build-create-recipetk

    • package-build-archive

    • package-build-all

  • 作成されるのは以下

    • archive-contents (インデックス情報)

    • パッケージの実体

    • archive-contentsの元になる.entryファイル

  • 次の設定で関連するファイルの出力先を変更できる

    • package-build-working-dir

    • package-build-archive-dir

    • package-build-recipes-dir