2011-12-01(木) [長年日記]
■ Herokuにkindlegenコマンドを入れるgemを作った(けど失敗)
たとえばHerokuでKindle向けにドキュメント配信をするようなサービスを動かすとして、ネックになるのが.mobiファイルの生成をどうするかである。考えつく方法として、
- Calibreが抱えているライブラリを持ってくる
- メールでPersonal Documentsに送信してうまく変換されることを祈る
- なんとかしてkindlegenコマンドをインストールする
Calibreのmobi変換はかなり優秀なので、これが一番スマートだとは思うけど、たしかPythonなので最後の手段。Personal Documentsの変換は品質に問題があるのでできれば避けたい。ということで、Herokuにkindlegenコマンドをインストールするという方向を探ってみることに。
Herokuへ何かをインストールする方法は、「git push」か「bundle install」しかない(たぶん)。しかしGitHubにリポジトリを公開することを考えると、そこにAmazonの所有物であるkindlegenを含めることはできないので、「git push」はいきなり除外。いちおうサービスの起動直後にtarballをダウンロードして展開することでkindlegenコマンドを取り出すという技もあるし、やってみたらできたのだけど(そういうことを狙ったと思われるコードはGitHubでも見つけられる)、配置先がtmpdirにならざるを得ないのでちょっとなー、という感じ。
ということで、gemを作ってその中でなんとかという方法が残った(前置きが長い)。
で、gemの作り方を調べて、拡張ライブラリを作る過程でなんとかつっこめそうだとわかり、適当なMakefileを吐き出すextconf.rbを書いてみたのがこれ:
これでインストールがこんな感じで簡単になった:
% gem install kindlegen
もちろんGemfileに書いておけばbundlerが入れてくれるようになるので、Herokuでも動くはず!
……と思ってやってみたらダメ。いや、少なくともgitの出力を見ている限りではインストールは成功しているようだ。しかし、サービスの中からkindlegenコマンドを起動してみると見つからないという。「heroku run console」でherokuに入り、binの下を探してみるとない。えっ、なんで!?
で、いろいろ調べてみると、インストール直後にbinの下から一部のコマンド(bundleとか)を除いて削除するプロセスが走っているようだとわかる。ついでにconsoleからファイルを作っても、logoutのタイミングで消される。ぬー、やるなHeroku(笑)。
ちょっと別の方法を探さないとなー。いちおうmobiファイルを生成するrubyなライブラリもあるみたいだから、ちょっとためしてみるか。ちなみにkindlegen gemは、Heroku抜きにしてもそれなりに便利なので個人的にはいいもの作った気分ではある。tarballでしか配布されていないツールをインストールする方法としてアリだね、これは。