music21をherokuサーバーで動かす時に困ったこと
自作アプリをWebサービスとして公開するにあたり、herokuを使うこととしました。
理由は、
あたりです。とにかくWebサービスのアップが初めてなのでハードルが低くて経験できるものを選びました。
デプロイまでは他サイトを参考にこぎつけたのですが、music21が動作するまでに苦労した点を残しておきます。
png出力ができない
画像出力には、下記の処理を実施していました。
from music21 import stream 〜省略〜 s = stream.Score() s.write('lily.png')
ローカルではうまく出力できたのですが、本番環境では画像が生成されない問題にぶつかりました。
どうも、lilypondの呼び出しで失敗しているようでした。確かにインストールした覚えがない(笑)。
importしない外部アプリをどうやってインストールするか?
herokuのデプロイ時、pip installできるものはrequirements.txtを用意することで自動的にインストールされます。
しかし、music21を動かすために必要な、lilypond、museScoreは別途インストールが必要になります。(どちらも画像やXmlなど出力に関するもの)
herokuでは、BuildPakcsという仕組みを利用することでデプロイ時に必要な外部アプリをインストールが可能になります。 他の開発者のリポジトリもありましたが、バージョンが古いことや、配置するパスを指定したかったので、folkして自前リポジトリを用意しました。
https://github.com/rakushoo/heroku-buildpack-LilyPond
https://github.com/rakushoo/heroku-buildpack-MuseScore
そして、実装側のmusic21に対して下記の設定を追加しました。
from music21 import environment us = environment.UserSettings() us['lilypondPath'] = '/app/lilypond/usr/bin/lilypond' us['lilypondVersion'] = "2.20.0" us['musicxmlPath'] = '/app/tool/MuseScore-3.4.2-x86_64.AppImage' us['musescoreDirectPNGPath'] = '/app/tool/MuseScore-3.4.2-x86_64.AppImage' ※ /app/はherokuサーバー上のソースコードが展開される場所
ひとまずBuildPacksに追加してデプロイをしたところ、write('musicxml')でのMusicXML出力はできるようになりました。
lilypondを使ったpng出力がまだできない状態だったので、別記事で対応方法を書きます。