はじめに
Cloud Functions for FirebaseでPythonが使えることになり、だいぶ時間が経っていますが、デフォルトではrequirements.txtだけでパッケージマネージャーを使う形になっていません。
何かと不便なのでPoetryを使えないかいろいろ試してみました。
でどうする?
問題点は後回しにして今回やった方法を先にお伝えします。
Poetryのコマンドで以下を設定し、プロジェクトローカルにvirtualenvを置きます。
poetry config --local virtualenvs.in-project true
このコマンドで.vnenvのフォルダーができると思います。
ただ、Cloud Functions for Firebaseではvirtualenvのパスがvenvに限定されているため、デプロイコマンドを実行した時点でエラーになります。
そこで、この.vnenvにシンボリックリンクを設定することによってvenvがあるように見せかけてしまいます!
ln -s .venv venv
あとはrequirements.txtが必要なので、以下のコマンドがデプロイ前に必要となります。
poetry export -f requirements.txt -o requirements.txt --without-hashes
poetryで入れたライブラリのrequirements.txtをいい感じで出力してくれるコマンドです。
毎回打つのは手間なので、poethepoetを使ってカスタムスクリプトを作ります。
poetry add --group dev poethepoet
インストールした後は、pyproject.tomlに以下を追加するだけです。
[tool.poe.tasks]
deploy.shell = """
poetry export -f requirements.txt -o requirements.txt --without-hashes;
firebase deploy --only functions --project default
""
あとは以下のコマンドでデプロイができるようになります。
poetry run poe deploy
この方法に至った経緯
あまり綺麗な方法ではないと思いましたが、これしかダメでした。
まず、Cloud Functions for FirebaseはPythonの場合、以下の構成を求めます。
myproject
+- .firebaserc
+- firebase.json
+- functions/
+- main.py
+- requirements.txt
+- venv/
firebase-toolsの中身を見る限り、venvのパスを変更することはできません。
そこでpoetry側でvenvを作れないかいろいろやってみたのですが、ダメでした・・・。
ダメだったケース1(virtualenvs.pathを使う)
以下のコマンドでvenvなんとか作ろうとしてみます。
poetry config --local virtualenvs.path ./venv
virtualenvs.pathを使うと、venvの場所を決められるとなっています。試しにやってみると指定したパスのしたにもう一つフォルダーができてしまうのです。
+- functions/
+- main.py
+- requirements.txt
+- venv
+-- functions-XXXXXX-py3.12
poetryはデフォルトではプロジェクト配下ではなく別の場所にどんどんvirtualenvを作るのですが、そのときにこのような名前のフォルダーを作っていくようになっています。
これでは意図したものになりません。
ダメだったケース2(virtualenvs.promptも使う)
この自動生成されるフォルダー名が、virtualenvs.promptという設定に依存していそうだったので、そこを変えてみましたが、変化ありませんでした。
あくまでこれは環境の名前を設定するものだったからかもしれません。
PoetryもFirebaseも融通が効かない・・・
まとめ
今回は私が今わかっている情報でちょっと微妙だけど動く方法を見つけたのでまとめましたが、最良の方法だとは思いません。
誰かもっといい方法があれば教えてほしいという感じです!
使ってる人がまだまだ少ないのが原因なのかもしれませんがもっと使いやすくなることを願います!