MELPAにレシピを投稿するには (2018年版)

この記事は以前書いた記事「[MELPAにレシピを投稿するには]」の内容を、本家の最新のアップデート[^1]に併せて、別記事として翻訳したものです。

↓ ここから翻訳 *(途中)*

----------

MELPAは「レシピ」によって構成され、レシピごとに一つの「パッケージ」を記述され、一つの専用リポジトリで管理されます。この文書ではMELPAに新しいパッケージの登録を提案するための方法を説明します。

MELPAのメンテナンスには三種類の役割の人々が貢献しています:

<dl>
<dt>MELPAメンテナ</dt><dd>新しいレシピと関連パッケージのレビューや、システムの維持の責任を担います</dd>
<dt>レシピ作者</dt><dd>良いレシピを提案し、メンテナンスする責任があります<br>(例: パッケージに名称変更や非推奨化などの変更があった場合など)</dd>
<dt>パッケージ作者</dt><dd>品質のよいEmacs Lispパッケージを書く責任があります</dd>
</dl>

可能ならパッケージ作者もレシピ作者の役割を果たすことをお勧めします。

レシピ作者とパッケージ作者がMELPAにレシピを提案するための準備のガイドラインについて説明します。パッケージを採用するプロセスを迅速化するため、可能な限りガイドラインに従ってください。ガイドラインは絶対ではなく、正当な理由があればケースバイケースで判断されます。

## Pull Requestの前に知ってほしいこと

新規のレシピ提出は以下のガイドラインに従ってください。

<dl>
<dt>フィードバックを待つ</dt><dd>レビュープロセスにおいてMELPAメンテナは、MELPAとEmacsパッケージシステムが動くか確認するためにあなたのパッケージを見ます。MELPAメンテナは、あなたのパッケージをMELPAに追加するための障害や、そうではないことについてコメントをするかもしれません。</dd>
<dt>Pull Requestごとに一つのレシピ</dt><dd>追加するパッケージが複数ある場合は、それぞれにPull Requestを作成してください。パッケージ同士が非常に密接に関連していて一つのリポジトリに含まれる場合(それが良い方法ではないことは後述します)は、一つのPull Requestにまとめて作成することもできます。その際は1コミットごとに一つのレシピを追加してください。</dd>
<dt>合理的で革新的なパッケージ</dt><dd>MELPAは「精査された」Emacs Lispパッケージのセットを提供しています。全てのLispファイルを網羅するためのリストではありません。MELPAメンテナは既存のパッケージが提供している機能をコピーしたパッケージを拒否します。できれば新しいパッケージを作るのではなく、既存のパッケージを改良してみてください。</dd>
<dt>ソフトウェア構成管理(SCM)</dt><dd>上流のソースコードはGitやMercurialなど権威ある<a href="https://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E6%A7%8B%E6%88%90%E7%AE%A1%E7%90%86">SCMソフトウェア</a>のリポジトリで管理される必要があります。<a href="https://www.emacswiki.org/">EmacsWiki</a>のパッケージはもはや受理されません。</dd>
<dt>公式リポジトリ</dt><dd>パッケージは公式のパッケージリポジトリから構築される必要があります。特別な事態を除いて、公式リポジトリからのフォークは受理されません。</dd>
<dt>専用のSCMリポジトリ</dt><dd>パッケージはそれぞれ専用のSCMリポジトリ(Gitなど)で管理してください。MELPA StableはSCMのタグを参照してパッケージにバージョン番号を割り当てるため、パッケージごとに別々のバージョン番号を持つことができます。</dd>
<dt>品質</dt><dd>私たちはMELPAを構成する一部であるパッケージの品質に気を配っているので、MELPAメンテナはすべてのレシピと関連パッケージをレビューします。以下のガイドラインを読み、従ってください。</dd>
<dt>パッケージ作成者への連絡</dt><dd>あなたがパッケージの作者でもメンテナでもないなら、作者に連絡してPull Requestの過程に含めてください。</dd>
<dt>レシピのメンテナンス</dt><dd>パッケージ作者が上流リポジトリを移動したときは、レシピも更新してください。変更の前後がどちらもGitHubの場合は、パッケージ作者はGitHubのリポジトリ転送機能を使って移動するのがよいでしょう。そうした場合、MELPAメンテナが変更が妥当であることの確認が容易になります。それ以外の場合は、古いリポジトリのREADMEから新しいリポジトリにリンクする必要があります。</dd>
</dl>

## あなたのレシピをマージさせるための準備

MELPAメンテナは各レシピおよび関連パッケージの品質を管理しています。レビューのプロセスを遅れさせないよう、以下のガイドラインに従っておくことをお勧めします。

<dl>
<dt>コーディングスタイルと慣習</dt><dd>Emacs Lispファイルは<a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Tips.html">Emacs Lisp conventions</a>(規約)と<a href="https://github.com/bbatsov/emacs-lisp-style-guide">Emacs Lisp Style Guide</a>に従ってください。</dd>
<dt>パッケージのメタデータ</dt><dd>パッケージの説明は<code>(info "(elisp) Packaging")</code>の<a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Packaging.html#Packaging">ドキュメンテーション</a>で説明される通りの<code>package.el</code>形式に則る必要があります。この形式についての具体的な説明は<a href="https://web.archive.org/web/20111120220609/http://marmalade-repo.org/doc-files/package.5.html">marmaladeパッケージのドキュメント</a>をお読みください。</dd>
<dt>品質チェックツールを利用する</dt><dd><a href="https://melpa.org/#/flycheck">Flycheck</a>と<a href="https://github.com/purcell/package-lint">package-lint</a>および<a href="https://github.com/purcell/flycheck-package">flycheck-package</a>は、あなたのパッケージから一般的なエラーを検出するのに役立ちます。また、<a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Tips.html">checkdoc</a>によってパッケージがドキュメント文字列の一般的な規則に従っているかを確認できます。</dd>
<dt>長い関数を避ける</dt><dd>関数が長いほど何が起こるかの理解が難しくなり、MELPAメンテナが適切なフィードバックを与えることが困難になるおそれがあります。コード中の改善の余地があると特定の箇所を差して指摘することも難しくなります。長い関数は、より小さく、適切に名付けられ、よく文書化されたものになるよう工夫してください。</dd>
<dt><em>(オプション)</em>リリースのためにタグをつける</dt><dd>あなたのパッケージの安定版を生成するには、<code>version-to-list</code>関数と互換性のあるバージョン番号の形式でSCMリポジトリにタグをつけるだけです。そのタグがつけられたコミットは安定版パッケージとして生成されます。</dd>
</dl>

<h2>典型的な問題を修正する</h2>

MELPAに提案されたパッケージには典型的な問題があり、その指摘によってレビューは数日から数週間遅れます。

パッケージの提出前にこのリストを再度確認してください。

* [ ] 上記で指定された品質チェックツールを実行してください *(絶対に!)*
* [ ] それぞれのEmacs Lispファイルの最初の行に `-*- lexical-binding: t; -*-` を付けることで[レキシカルバインディング](https://www.gnu.org/software/emacs/manual/html_node/elisp/Lexical-Binding.html)を有効化してください。なぜ常にそうしなければいけないかを知りたければ[Chris WellonsのEmacs記事](https://nullprogram.com/tags/emacs/)(特に[Some Performance Advantages of Lexical Scope](https://nullprogram.com/blog/2016/12/22/))を読んでください
* [ ] 既存のFaceを`:inherit`した上で属性を上書きする (例: 太字にする、下線をつける、色を反転させる) ような定義はやめてください。ユーザーの設定によっては、ひどいことになります。単に`:inherit`だけにして、ユーザー自身にカスタマイズさせるのがベストです。
* [ ] コンパイラに[関数参照](https://www.gnu.org/software/emacs/manual/html_node/elisp/Anonymous-Functions.html)を指示するために、関数名に単に`'`をつける(つまり`quote`特殊形式)の代りに `#'` (つまり`function`特殊形式)をつけるようにします。(例: `(seq-filter #'evenp list)`)

## MELPAへのPull requestの準備

MELPAにPull requestを送るには、はじめに[MELPAリポジトリ](https://github.com/melpa/melpa)をforksします。そして必要なレシピを追加し、テストしなければいけません。

### レシピファイルの作成

`package-build-recipes-dir`で指定されたディレクトリ(デフォルトは`package-build`がロードされた位置の`recipes/`ディレクトリ)にファイルを作成します。`package-build/package-build.el`にある`package-build-create-recipe`コマンドを使って工程を対話的に支援することもできます。ファイル名は、そのパッケージが提供する「feature名」と一致させる必要があります。

このファイルに記述する内容の形式はREADMEの[recipe format](https://github.com/melpa/melpa/blob/master/README.md#recipe-format)節を参照してください。パッケージ名はファイル名と一致しなければいけません。

レシピは関連するファイルのみを指定することで、生成されるパッケージのファイルサイズが最小になるようにすることが望ましいです。

### レシピをテストする

以下の手順でパッケージが正しくビルドされるかどうかをテストできます。

コマンドラインから`make recipes/<name>`を実行するか、レシピを編集中のバッファで`C-c C-c`を押すことでレシピをビルドします(以下、`<NAME>`は今回作成するパッケージ名=ファイル名を指します)。環境変数`$PATH`に含まれる`emacs`コマンドが23以上であるか、または環境変数`$EMACS_COMMAND`が適切な`emacs`実行ファイルのpathに設定されてることを確認してください。

リポジトリにリリースタグがつけられている場合は`STABLE=t make recipes/<NAME>`を実行して、正しいバージョンが期待通りに特定されているかを確認してください。バージョン番号の記法は、レシピの`:version-regexp`節に記述することで変更することも可能です。詳細はREADMEの[recipe format](https://github.com/melpa/melpa/blob/master/README.md#recipe-format)を参照してづあさい。

Test that the package installs properly by running package-install-file from within Emacs and specifying the newly built package in the directory specified by package-build-archive-dir (default: packages/ directory where package-build was loaded). Entering “yes” when prompted after pressing C-c C-c in the recipe buffer also works.

You can optionally run a sandboxed Emacs in which locally-built packages will be available for installation along with those already in MELPA:

EMACS_COMMAND=/path/to/emacs make sandbox INSTALL=<name>
From within Emacs, install and test your package as appropriate. This is a useful way to discover missing dependencies.

Opening a pull request
Create a dedicated pull request branch in your clone of the MELPA repository and push this branch to your fork. Finally, go to the MELPA repository and open the pull request.

Include the following information in the pull request description:

a brief summary of what the package does;
a direct link to the package repository;
your association with the package (e.g., are you the maintainer? have you contributed? do you just like the package a lot?);
relevant communications with the upstream package maintainer (e.g., package.el compatibility changes that you have submitted).
Consider the hub command-line utility by defunkt which helps simplify this process.

Waiting for reviews and taking feedback into account
MELPA maintainers spend a lot of time reviewing proposed packages and also have quite a lot of other non-MELPA-related activities. Please be patient as it might take a week (sometimes several) before one starts having a look at your pull request.

If you were asked to make several changes, then you should explicitly mention everything that you have fixed, and possibly even link to the relevant commits. One way of doing that is to mention the MELPA pull request in every commit addressing one of the raised points: just write `melpa/melpa#N` in each commit message where `N` is the pull request number.

You can help MELPA maintainers take care of pull requests much faster by paying real attention to the quality of your package (see above for some quality checks and links). If you feel for it, you can also take another pull request and give feedback to the author.

[^1]: [Reorganize the CONTRIBUTING file by DamienCassou · Pull Request #5630 · melpa/melpa](https://github.com/melpa/melpa/pull/5630)
[MELPAにレシピを投稿するには]: https://qiita.com/tadsan/items/b74856f555720a5ca2e5