はじめに
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も融通が効かない・・・
まとめ
今回は私が今わかっている情報でちょっと微妙だけど動く方法を見つけたのでまとめましたが、最良の方法だとは思いません。
誰かもっといい方法があれば教えてほしいという感じです!
使ってる人がまだまだ少ないのが原因なのかもしれませんがもっと使いやすくなることを願います!