在 Heroku 上執行 Perl App

作者:   發佈於:  

自從 Heroku Cedar Stack 正式釋出後,各種程式語言的支援也愈來愈多,由於其簡單易懂 的建構包 (buildpack) 架構,也 讓第三方開發者能自行擴充,基本上任何語言都能支援(只要能被編譯)。Perl 方面的支援, 則是由judofyr 實做出了建構包,稱之為 perloku

要在 heroku 上建立 perloku app,要先建好 git 專案目錄,寫好 app 之後,在其中執行:

heroku create -s cedar --buildpack http://github.com/judofyr/perloku.git

這之後只要執行 git push heroku master 就可以佈署了。

perloku 定義出的 perl app 需滿足以下條件:

  1. Web App Server 執行檔為 "Perloku",必須認 PORT 環境變數,並啟動 前景 行程
  2. 所需要的 CPAN 模組定義於 Makefile.PL 當中

也就是說基本上用什麼 web framework 都可以,但需要自行提供一個名為 Perloku 的執 行檔。官方的範例是用 Mojolicious::LitePerloku 執行檔為以下內容:

#!/bin/sh
./app.pl daemon --listen http://*:$PORT

(Mojolicous 的 "daemon" 指令並不如一般 "daemonized" 是把行程放在背景執行之意,有點 混淆,但總之,就是這樣。)

一般如果寫 Plack 規格的 Web App,已經有 app.psgi,就可以用 plackup

#!/bin/sh
plackup -p $PORT -e production

Makefile.PL 的內容大致上如下:

use ExtUtils::MakeMaker;

WriteMakefile(
    NAME         => '...',
    VERSION      => '1.0',
    AUTHOR       => '...',
    PREREQ_PM    => {
        'Mojolicious' => '2.0'
    }
);

由於不是寫來做成 CPAN 模組的,基本上只有 PREREQ_PM 的內容比較重要,在其中需要指 定模組名稱以及版號。實際用來安裝 CPAN 模組的是 cpanm,並且 不會 執行模組測試。

其他幾點重點:

  1. Cedar Stack 有提供 可讀寫的 檔案系統,但為「短命型」的,而且每份 dyno 之間不會互通。因此不能拿檔案來做為永久型的資料儲存媒介。也就是說如 SQLite 或 DBM 這類的資料庫皆不能用。參考: Dyno Isolation
  2. 程式的根目錄為 /app,模組則會裝在 /app/vendor,有設定好 $PATH 指到 /app/vendor 中。
  3. heroku run "ls" 所看見的檔案、目錄,似乎不是實際上執行 app server 的目錄。推測應該是 編譯完畢後的結果。執行 app server 的 dyno 應為他處。

目前已經把 MoreText 丟去跑,過程很順利,還不賴。 MoreText 本身是個Dancer App,但沒有使用資料庫,相對來說單純許多。有興趣者可追蹤 MoreText 源碼 以窺一二。

附帶一提,新做了一個螢幕保護系的 MoreText 應用: http://more.handlino.com/leanback