はじめに
お祭り特集! nikkieです。
既存のDjangoアプリケーションにPoetryを導入してみます。
目次
Djangoを使ったWebアプリ開発
Djangoを使ってWebアプリを開発してきていますが、ふと気づいたことがあります。
それは、Djangoを使ったWebアプリ自体はインストールしないということです。
Djangoや他の依存ライブラリを仮想環境にインストールして、私たちのソースコードを動かします
- Django Girls Tutorial 「requirementsファイルによってパッケージをインストールする」
- Django公式ドキュメント 「pip を使用して公式リリースをインストールする」
Dockerイメージを作る際も、依存ライブラリをインストールしたうえで、ソースコードを配置します。
私たちのアプリケーションをDockerコンテナ内で(site-packages以下に)インストールする例はあまり見たことがありません。
そこで思ったのです。
依存ライブラリの管理にツールを、例えばPoetryを使ったらどうなるのだろう、と。
見つけた動画を元に手を動かしました。
依存をPoetryで管理(「Pro Django」より)
検索して見つけたこちらのごく序盤を見ました。
ソースコードはこちらかなと思います。
Poetryのコマンドは以下でした。
$ poetry init $ poetry add
poetry init
この動画ではdjango-adminがグローバルで使える前提でした。
startprojectで作ったディレクトリの中でpoetry initしていきます。
https://python-poetry.org/docs/cli/#init
This command will help you create a pyproject.toml file interactively by prompting you to provide basic information about your package.
対話的にpyproject.tomlを作るコマンドでした。
このpyproject.tomlはPoetryの独自書式です1(tool.poetryの下に定義されています)
poetry add
https://python-poetry.org/docs/cli/#add
The add command adds required packages to your pyproject.toml and installs them.
addするパッケージを
pyproject.tomlに記載- かつ、Poetryが管理する仮想環境にインストール
するコマンドです。
poetry.lockもできます。
手元で試した例
$ poetry add Django@~4.2.4 django-environ psycopg2
addのドキュメントにありますが、Django@~4.2.4は4.2系の最新という指定です
poetry install
私は今回叩いていませんが、他の開発者が容易に環境を再現できるとして紹介されました。
https://python-poetry.org/docs/cli/#install
The install command reads the pyproject.toml file from the current project, resolves the dependencies, and installs them.
再現にはpoetry.lockが参照されます。
If there is a poetry.lock file in the current directory, it will use the exact versions from there instead of resolving them.
終わりに
「Pro Django」を例に、既存のDjangoプロジェクトにPoetryを導入してみました。
poetry initでpyproject.tomlを作り、poetry addでpyproject.toml & lockファイルを更新。
Poetryを使っていれば、開発者は互いに簡単に環境を再現できるわけですね。
自作のDjangoやられアプリにPoetryを導入してみています。
このあとの開発で必要になるであろうrunserverはpoetry runから叩くようです。
ref: https://github.com/thenewboston-developers/thenewboston-Backend/blob/fe970c1a1107aeab8d224c8550afd94d4be6cae4/Makefile#L65-L66
本格導入するにはまだまだ素振りで経験値を稼ぎたいですが、ひとまず使い出せました!
追記:package-mode (2024/08/19)
poetry installしたときの警告メッセージから、pyproject.tomlにpackage-modeを指定するのがよさそうでした。
https://python-poetry.org/docs/pyproject/#package-mode
[tool.poetry] package-mode = false
pyproject.tomlを置いたPythonプロジェクト(今回はDjango製アプリケーション)自体はインストールしない設定です。
- PEP 621をサポートしていないと言われる点でもあるなと思いました ↩