Perl5のPSGIアプリ用buildpackのまとめ

<!--
# **確認したバージョン**: ... を生成するスニペット（Ruby）

require 'octokit' # gem install octokit
requrie 'uri'

# url: https://github.com/miyagawa/heroku-buildpack-perl/commit/2da7480a8339f01968ce3979655555a0ade20564
def version_note(url)
  _, owner, repo, _, sha = URI(url).path.split("/")
  commit = Octokit::Client.new.commit("#{owner}/#{repo}", sha)
  "**確認したバージョン**: [%s (%s)](%s)" %
    [
     commit.sha.slice(0, 8),
     commit.commit.committer.date.strftime("%Y/%m/%d"),
     commit.html_url
    ]
end
-->

**tl;dr** - HerokuでPSGIアプリを動かすなら https://github.com/pnu/heroku-buildpack-perl がおすすめ。

## [miyagawa/heroku-buildpack-perl](https://github.com/miyagawa/heroku-buildpack-perl)

**確認したバージョン**: [ae9e87e3 (2014/10/31)](https://github.com/pnu/heroku-buildpack-perl/commit/ae9e87e347172c34efbff331ea00f5d683078fd2)

- **detect**: `app.psgi`が存在するときにbuildpackが有効になる。
- **Perl**: dynoに最初からインストールされている`/usr/bin/perl`を使う。
- **依存解決**: cpanmをインストールして`cpanm --installdeps .`を実行することで依存しているCPANモジュールをインストールする。
  - **キャッシュ**: cpanmによってインストールされたモジュールを`CACHE_DIR`にキャッシュする。
- Webサーバーは[Starman](http://search.cpan.org/~miyagawa/Starman/lib/Starman.pm)。

## [miyagawa/heroku-buildpack-perl#carton](https://github.com/miyagawa/heroku-buildpack-perl/tree/carton)

[miyagawa/heroku-buildpack-perl](https://github.com/miyagawa/heroku-buildpack-perl)のfork。

**確認したバージョン**: [3066d917 (2013/07/24)](https://github.com/miyagawa/heroku-buildpack-perl/commit/3066d9170ed33936209d33dacf71d4a50e1748c6)

- **Perl**: `.perl-version`に対応するPerlを`cache.bulknews.net/heroku/perl-$PERL_VERSION.tgz`からダウンロードしてインストールする。
  - 利用できる最新バージョンは5.18.0。
  - [Support perl versions · Issue #3 · miyagawa/heroku-buildpack-perl](https://github.com/miyagawa/heroku-buildpack-perl/issues/3)
- **依存解決**: cpanmを使ってcarton 0.9.59をインストールして、`carton install --deployment`でアプリケーションが依存しているCPANモジュールをインストールする。
  - おそらくこのバージョンのcartonだと`cpanfile.snapshot`ではなく`carton.lock`が使われるはず（[perl-carton/carton at v0.9.59 - README](https://github.com/perl-carton/carton/tree/v0.9.59#initializing-the-environment)）。
  - 現在は[curl --silent https://raw.github.com/miyagawa/cpanminus/master/cpanm returns no content · Issue #10](https://github.com/miyagawa/heroku-buildpack-perl/issues/10)の問題でcpanmのインストールに失敗する。masterブランチでは修正済みだがcartonブランチには反映されていない。
  - **キャッシュ**: `./local/`を`$CACHE_DIR/$PERL_VERSION/local`にキャッシュする。
- Webサーバーとして`carton exec`を経由してstarmanを起動する。

作者による解説: [Carton and perl version support: miyagawa/heroku-buildpack-perl - Tatsuhiko Miyagawa's blog](http://weblog.bulknews.net/post/53255720316/carton-and-perl-version-support)

## [pnu/heroku-buildpack-perl](https://github.com/pnu/heroku-buildpack-perl/)

**確認したバージョン**: [ae9e87e3 (2014/08/14)](https://github.com/pnu/heroku-buildpack-perl/commit/ae9e87e347172c34efbff331ea00f5d683078fd2)

[miyagawa/heroku-buildpack-perl](https://github.com/miyagawa/heroku-buildpack-perl)のfork。

Perl環境向けのbuildpackの中ではおそらく一番作りこまれていて、汎用性が高い。まずはこれを使うことを検討するとよさそう。

基本的な機能や使い方は[README](https://github.com/pnu/heroku-buildpack-perl/#readme)にまとまっている。

[compile](https://github.com/pnu/heroku-buildpack-perl/blob/master/bin/compile)だけで100行近くの分量があるので、重要そうな部分だけ紹介する。

- **Perl**: `.perl-version`に対応するPerlを`https://heroku-buildpack-perl.s3.amazonaws.com/perl-$PERL_VERSION.tgz`からダウンロードしてインストールする。
  - 利用できる最新バージョンは5.20.0。
  - `system`を指定するとdynoのperlが使われる。
- **依存解決**:
  - `carton install --deployment --cached`, `cpanm --installdeps .`で依存しているモジュールをインストールする。
    - local::libを使って、cpanmによるモジュールのインストール先もcartonと同じ`./local/`に設定している。
  - **キャッシュ**: `./local/`をキャッシュする。Perlのバージョン指定が前回のcompile時とは違っていたらキャッシュを破棄する。
- 依存モジュールが多すぎてcompileがタイムアウトするアプリ向けに、あらかじめtarで固めておいた`./local/`をダウンロードしてそのまま使う機能がある。
- 環境変数でPerlを取得するサーバー、cpanmのオプション、CPANのミラー、Perlのバージョン（`.perl-version`より優先される）などを設定できる。

## [shoichikaji/heroku-buildpack-perl#relocatable-perl](https://github.com/shoichikaji/heroku-buildpack-perl/tree/relocatable-perl)

[miyagawa/heroku-buildpack-perl](https://github.com/miyagawa/heroku-buildpack-perl)のfork。

**確認したバージョン**: [1d021019 (2014/09/23)](https://github.com/shoichikaji/heroku-buildpack-perl/commit/1d021019eb858cfeabf83c9e0f45d92e3591e78f)

- **Perl**: https://github.com/shoichikaji/relocatable-perl でreleaseされているrelocatableなperlバイナリをインストールする。

### リンク

- [heroku で 最新の perl を使う - skaji's blog](http://ks0608.hatenablog.com/entry/2014/09/23/035411)
- [リロケータブル Perl - skaji's blog](http://ks0608.hatenablog.com/entry/2014/07/06/170328)
- [relocatable-perl // Speaker Deck](https://speakerdeck.com/shoichikaji/relocatable-perl)

## [sng2c/heroku-buildpack-perlcarton](https://github.com/sng2c/heroku-buildpack-perlcarton)

[miyagawa/heroku-buildpack-perl](https://github.com/miyagawa/heroku-buildpack-perl)のfork。

**確認したバージョン**: [e32f90b1 (2014/09/12)](https://github.com/sng2c/heroku-buildpack-perlcarton/commit/e32f90b1a6db3e6d16336354818940732f8d6e58)

- **detect**: `cpanfile`と`vendor`が存在するときに有効になる。
- **Perl**: dynoに最初からインストールされている`/usr/bin/perl`を使う。
- **依存解決**: `carton install --deployment --cached`で依存しているモジュールをインストールする。

## [judofyr/perloku](https://github.com/judofyr/perloku)

**確認したバージョン**: [f5a55a8c (2014/08/21)](https://github.com/judofyr/perloku/commit/f5a55a8cb441eaaaa5216d8aa0bd32927a557fc8)

- **detect**: `Perloku`が存在するときに有効になる。
- **Perl**: perl 5.18.1を perloku.s3.amazonaws.com からインストールする。
- **依存解決**: cpanmで依存しているモジュールをインストールする。

## [kazeburo/heroku-buildpack-perl-procfile](https://github.com/kazeburo/heroku-buildpack-perl-procfile/)

**確認したバージョン**: [571d80fc (2014/06/27)](https://github.com/kazeburo/heroku-buildpack-perl-procfile/commit/571d80fccf202030847cc400157c839e63ef9543)

- **detect**: 「`Makefile.PL`, `Build.PL`, `META.json`, `cpanfile`」のどれかが存在して、かつ`Procfile`が存在するときにbuildpackが有効になる。
- **Perl**: dynoに最初からインストールされている`/usr/bin/perl`を使う。
- **依存解決**: `cpanm --installdeps .`で依存しているモジュールをインストールする。
- `compile`の実行時に、パスを通すシェルスクリプトを[.profile.d](https://devcenter.heroku.com/articles/profiled)に追加する。

## リンク

- [Third-Party Buildpacks | Heroku Dev Center](https://devcenter.heroku.com/articles/third-party-buildpacks)
  - "A buildpack that runs Perl/PSGI apps" - [miyagawa/heroku-buildpack-perl](https://github.com/miyagawa/heroku-buildpack-perl)
  - "Buildpack for Apache2/mod_perl apps" - [lstoll/heroku-buildpack-perl](https://github.com/lstoll/heroku-buildpack-perl)

<a rel="license" href="http://creativecommons.org/publicdomain/zero/1.0/"><img src="http://i.creativecommons.org/p/zero/1.0/80x15.png" style="border-style: none;" alt="CC0" /></a>