MeCabを利用したWebアプリケーションをHerokuにデプロイしようとして、環境をrequirements.txtにまとめていたのですが、、、どうしてもエラーが出てインストールが止まってしまうことがありました。原因は、Mecabだったようなので、エラー回避方法を共有します。
前提条件として、
- mecabをpip mecabでインストール済み
- HerokuをCLIでいじる準備ができている
とりあえずrequirements.txtを作成
まあ、pip listしてまず現環境におけるライブラリをみていきましょう。
例えばこんな構成だとします。
(myvenv)$ ~ pip list
Package Version
---------------------- -------------------
certifi 2020.6.20
chardet 3.0.4
click 7.1.2
Flask 1.1.2
gunicorn 20.0.4
idna 2.10
itsdangerous 1.1.0
Jinja2 2.11.2
MarkupSafe 1.1.1
mecab 0.996.2
mysql-connector-python 8.0.21
oauthlib 3.1.0
pip 20.1.1
protobuf 3.12.4
requests 2.24.0
requests-oauthlib 1.3.0
setuptools 49.2.0.post20200714
six 1.15.0
urllib3 1.25.10
Werkzeug 1.0.1
wheel 0.34.2
中段くらいにmecabのバージョン0.996.2がありますね。それではこれをもとに、requirements.txtを作成していきます。
(myvenv)$ ~ pip freeze > requirements.txt
これで下準備OKです
Herokuへログインしてデプロイ
それではコマンドラインを開きまして、デプロイしていきましょう。
$ ~ heroku % login
これを打つと、認証画面的にブラウザが勝手に開きます。それでログインできていれば、この画面を消してターミナルに戻る旨の内容が書かれています。
それで、成功したとして、次は
$ ~ % heroku git:clone -a your-app-name
$ ~ % cd your-app-directory
$ your-app-directory % git add .
$ your-app-directorygit % commit -am "deploy!!"
$ your-app-directorygit % push heroku master
こうするとPythonの場合、runtime.txtからPythonのバージョンを、requirements.txtから依存ライブラリのパッケージを確認して、インストールしていくと次のような問題が発生します。
-----> Python app detected
-----> Installing python-3.8.5
-----> Installing pip 20.0.2, setuptools 39.0.1 and wheel 0.34.2
-----> Installing SQLite3
-----> Installing requirements with pip
Collecting certifi==2020.6.20
Downloading certifi-2020.6.20-py2.py3-none-any.whl (156 kB)
Collecting chardet==3.0.4
( 中略 )
Collecting mecab==0.996.2
Downloading mecab-0.996.2.tar.gz (62 kB)
ERROR: Command errored out with exit status 1:
command: /app/.heroku/python/bin/python -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-kr1kq54r/
mecab/setup.py'"'"'; __file__='"'"'/tmp/pip-install-kr1kq54r/mecab/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)
(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))'
egg_info --egg-base /tmp/pip-install-kr1kq54r/mecab/pip-egg-info
cwd: /tmp/pip-install-kr1kq54r/mecab/
Complete output (10 lines):
/bin/sh: 1: mecab-config: not found
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/tmp/pip-install-kr1kq54r/mecab/setup.py", line 53, in <module>
include_dirs=cmd2("mecab-config --inc-dir"),
File "/tmp/pip-install-kr1kq54r/mecab/setup.py", line 19, in cmd2
return cmd1(strings).split()
File "/tmp/pip-install-kr1kq54r/mecab/setup.py", line 15, in cmd1
return os.popen(strings).readlines()[0].rstrip()
IndexError: list index out of range
----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
! Push rejected, failed to compile Python app.
! Push failed
こんな感じに怒られるわけですよ...orz
悪さをするのはMecabだった!?
どうやら悪さをしていたのは、MeCabだったようです。再度requirements.txtの一部を確認します。
requirements.txt |
----------------------------
certifi==2020.6.20
chardet==3.0.4
click==7.1.2
Flask==1.1.2
gunicorn==20.0.4
idna==2.10
itsdangerous==1.1.0
Jinja2==2.11.2
MarkupSafe==1.1.1
mecab==0.996.2
..................
どうやら調べてみると、このmecabで指定しているのがよくないみたいですね...
というわけで、このmecab==0.996.2というのをどかしてやりますね。どうするかと言いますと、
mecab-pythonに変えてあげます。特にバージョンは指定しなくてもよかったです。
ということで直します。
requirements.txt |
----------------------------
..................
..................
mecab-python # mecab==0.996.2 を修正
..................
これでうまくいくはずです!!
もしうまくいかなかったら、打ち損じとか全角になってないか、他のライブラリでのエラー等を疑うといいと思います。
これぬまにハマりそうなので、同じエラーに悩む人がいたら是非参考にしてください。