概要
PythonはGoと違ってライブラリのdeprecatedや破壊的変更が多いため、環境やライブラリバージョンの固定が非常に重要です。
- Dev Containers
- poetry
- 仮想環境(venvなど、今回はpoetryのvirtualenv)
を使うことで、それらを固定してチーム内で安定した開発環境を構築できます。
環境
役割
Dev Containersのアーキテクチャはこのようになっています。
ref: https://code.visualstudio.com/docs/devcontainers/containers
ソースコードをマウントし、実行環境だけコンテナ化することで開発環境を統一することができます。
役割をそれぞれ説明すると以下のようになります。
コンポーネント | 役割 |
---|---|
Dev Containers | pythonのバージョンの固定、実行環境(OSなど)の統一 |
poetry | パッケージ管理(バージョンロックなど)。仮想環境の用意も可能 |
仮想環境 | パッケージの導入状態をプロジェクト毎に独立させる |
仮想環境については「Dev Containersですでに仮想化されているので不要では?」とも思いますが、以下のメリットがあるので使った方が良いでしょう。
- コンテナ内で複数のPythonプロジェクトを開発している場合、仮想環境を使ってプロジェクトごとに異なる依存関係を管理できる
- Dev Containersを使用せずにローカル環境で作業する場合でも、同じ設定を容易に再現できる
構築方法
まずは拡張機能を↓からインストールしておきます。
Dev Containersの導入
コマンドパレット(macOSならCmd+Shift+P)でdev containers
と入力し、構成ファイルの追加を選択します。
次にワークスペースを選択。
次にPythonを選択。
Pythonのバージョンを選択します。
LLaMAなどは最新バージョンだと↓のように怒られるので、今回は3.11を選択します。
llama-index requires Python >=3.8.1,<3.12, so it will not be satisfied for Python >=3.12,<4.0.0
最後に追加パッケージとしてPoetryを選択します。注意としてチェックボックスをクリックしないと有効化されません。
devcontainer.json
すると.devcontainer/devcontainer.json
というファイルが生成されます。
先程の手順で進めると↓のようになります。
// For format details, see https://aka.ms/devcontainer.json. For config options, see the // README at: https://github.com/devcontainers/templates/tree/main/src/python { "name": "Python 3", // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile "image": "mcr.microsoft.com/devcontainers/python:1-3.11-bookworm", "features": { "ghcr.io/devcontainers-contrib/features/poetry:2": {} } // Features to add to the dev container. More info: https://containers.dev/features. // "features": {}, // Use 'forwardPorts' to make a list of ports inside the container available locally. // "forwardPorts": [], // Use 'postCreateCommand' to run commands after the container is created. // "postCreateCommand": "pip3 install --user -r requirements.txt", // Configure tool-specific properties. // "customizations": {}, // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. // "remoteUser": "root" }
次のように修正してPoetryのバージョンを固定します。
"features": { "ghcr.io/devcontainers-contrib/features/poetry:2": { "version": "1.7.1" } }
設定が完了したらコマンドパレットから「コンテナで再度開く」 or 「コンテナをリビルド」します。
以降は設定したディレクトリ(.devcontainer/devcontainer.json
があるディレクトリ)から開くと次のようにVS Codeがよろしく訊いてくれます。
動作確認
上部メニューからターミナルを作成します。
uname
などのコマンドを打つと設定した環境になっていることを確認できます。
Poetryの設定
先程のターミナルで
$ poetry init
を実行します。それ以降の設定は任意なので全てyesやEnterでもOKです。
するとpyproject.toml
が生成されます。
[tool.poetry] name = "python-init" version = "0.1.0" description = "" authors = ["Junpei Tsuji <xxx@gmail.com>"] readme = "README.md" [tool.poetry.dependencies] python = "^3.11" [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api"
readme = "README.md"
とあるように、README.md
がないと怒られるので用意しておきます。
$ touch README.md
仮想環境の設定
次のように打ち、ライブラリなどが今のディレクトリ直下の仮想環境で管理されるようにします。
$ poetry config virtualenvs.in-project true --local
次のようなpoetry.toml
が生成されます。
[virtualenvs] in-project = true
以降は
$ poetry run xxx
とすれば、この仮想環境で実行してくれるようになります。
※最初にpoetry run
を実行した際には.venv
フォルダが生成されます。
ライブラリの追加
$ poetry add streamlit
などパッケージを追加すると、.venv
に追加されていきます。
このように仮想環境によってパッケージの導入状態をプロジェクト毎に独立させることができます。