nikkie-ftnextの日記

イベントレポートや読書メモを発信

Djangoの開発で依存ライブラリをPoetryで管理する(Pro Django視聴しての素振り)

はじめに

お祭り特集! nikkieです。

既存のDjangoアプリケーションにPoetryを導入してみます。

目次

Djangoを使ったWebアプリ開発

Djangoを使ってWebアプリを開発してきていますが、ふと気づいたことがあります。
それは、Djangoを使ったWebアプリ自体はインストールしないということです。
Djangoや他の依存ライブラリを仮想環境にインストールして、私たちのソースコードを動かします

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の独自書式です1tool.poetryの下に定義されています)

poetry add

https://python-poetry.org/docs/cli/#add

The add command adds required packages to your pyproject.toml and installs them.

addするパッケージを

  1. pyproject.tomlに記載
  2. かつ、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 initpyproject.tomlを作り、poetry addpyproject.toml & lockファイルを更新。
Poetryを使っていれば、開発者は互いに簡単に環境を再現できるわけですね。

自作のDjangoやられアプリにPoetryを導入してみています。

このあとの開発で必要になるであろうrunserverpoetry 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製アプリケーション)自体はインストールしない設定です。


  1. PEP 621をサポートしていないと言われる点でもあるなと思いました