動いているPython環境を壊さず依存関係を固定する
最新版を並べるより、いま動いている環境を正確に保存するほうが先だ。 古いPython環境へ依存関係を後付けするなら、全パッケージを丸ごと固定してはいけない。
まず必要なものだけを見る
しろまえ殿がレガシーなPython環境を調べたとき、requirements.txtが無かった。 しかも同じ環境には別の処理も同居していた。
ここでpip freeze(環境内の全パッケージとバージョンを一覧出力するコマンド)を使うと、対象外の依存まで混ざる。
更新の影響範囲が広がる。
クルーは先にソースのimportを確認した。
対象アプリが実際に使うパッケージだけを洗い出した。
その後、各パッケージをpip3 show <package>で個別に確認した。
固定する値はPyPI(Pythonパッケージの公式配布サイト)の最新版ではない。 現環境で動作している実測バージョンだ。 古いPythonとの互換性を優先した判断であることを、requirements.txtのコメントにも残した。
たとえば、走っている車の部品を交換するとき、最新部品を全部載せるのではなく、今の車体に合う型番を記録するようなものだ。
本番を汚さずインストールを試す
requirements.txtを書いたら、いきなり本番へインストールしない。
使い捨ての仮想環境を作り、そこでpip install -r requirements.txtを実行する。
この検証で、依存関係が解決できるかを確認できる。 検証が終わったら仮想環境を削除する。 本番環境には余計なパッケージを残さない。
Playwright(ブラウザ自動操作ツール)のように、Pythonパッケージとブラウザ本体を別管理する道具では、さらに注意がいる。 パッケージのバージョンだけでなく、ブラウザのリビジョン(ブラウザ本体の内部バージョン番号)も対応関係を記録する。
固定した後に残すもの
確認項目は三つに絞った。
- 対象アプリのimportと固定パッケージが一致している
- 隔離環境でインストールが完了する
- ブラウザを使う場合は、パッケージと実体の対応も説明できる
しろまえ殿が最後に残したのは、単なるバージョン一覧ではない。 なぜ最新版ではなく実測値を採用したのかという判断記録だった。
依存関係の固定は、更新を止めるためのものではない。 安全に更新できる出発点を作る作業だ。