nikkie-ftnextの日記

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

pip-compile-multi体験記:小さく分けたrequirementsファイルたちを元に、環境をlockして管理できる!

はじめに

解釈一致!! nikkieです😭

先日pip-toolsを触りましたが、

関連するpip-compile-multiを今回触りました。

目次

pip-compile-multiとは

pip-toolsのREADMEで「Other useful tools1」として紹介されています!
https://github.com/jazzband/pip-tools/tree/dee50c43ff9c95f9c57a7116bd4c36771f494318#other-useful-tools

pip-compile command wrapper for multiple cross-referencing requirements files.

(意訳) 複数の相互参照するrequirementsファイルに対するpip-compileコマンドラッパー

pip-toolsは pip-compile -> pip-sync の順でしたが、pip-compileをpip-compile-multiに置き換えられるという理解です。

pip-compile-multiの使い方

pip install pip-compile-multiでインストールできます

使い方(導入方法)

  1. requirementsディレクトを作ります
  2. フォルダ内にXXX.inファイルを置きます
    • 複数置くことができます
    • 参照できます(requirements以下の相対パスでよい)
-r base.in
# 省略

この状態でpip-compile-multiと叩くと、requirementsフォルダ以下にXXX.txtができます。

ref: How to start using pip-compile-multi on existing project

自作ライブラリに導入して手を動かす

pip-toolsのときも実験台にしたocroyを今回も使います。

% python -V
Python 3.11.4
% python -m venv piptools_env --clear --upgrade-deps

piptools_env仮想環境にインストールして進めていきます。

% pip install pip-compile-multi
% pip freeze
build==1.0.3
click==8.1.7
packaging==23.2
pip-compile-multi==2.6.3
pip-tools==7.3.0
pyproject_hooks==1.0.0
toposort==1.10

requirementsディレクトリを作ります(※雰囲気が伝わるように抜粋して示しています)

.
├── ocroy
├── pyproject.toml
├── requirements
├── setup.py
├── tests
└── venv

requirementsディレクトリの中に、pyproject.tomlのoptional-dependenciesごとにXXX.inファイルを配置します。

requirements/base.in

  • editable installの指定。リポジトリルートからの相対パス
  • 現在ocroyにはdependenciesはありませんが、あったらここに書く認識です
-e file:.

requirements/google.in

-r base.in
google-cloud-vision

requirements/tesseract.in

-r base.in
pytesseract

requirements/dev.in

-r google.in
-r tesseract.in
pip-compile-multi
taskipy
autoflake
pyupgrade
black
isort
pytest
pytest-randomly
flake8
mypy
types-protobuf
types-requests
types-Pillow

pip-compile-multiを叩きましょう。

以下のファイルができます(環境をlockしています)

  • requirements/base.txt
  • requirements/google.txt
  • requirements/tesseract.txt
  • requirements/dev.txt

これらをpip-syncに渡せば、仮想環境が同期します!

% pip-sync requirements/*.txt

base.inが参照できているので、依存ライブラリのインストールに加えて、ocroyはeditable installされています!

全容はこちらからどうぞ:

pip-compile-multi ドキュメント読みメモ

いいなと思ったのが、小さいXXX.inを組合せられる点(私の好きなシンプル!)。
これはBenefitsの1つです。

*.in files are small and manageable because they store only direct dependencies.

また、pip-compile-multiパラメタで柔軟に設定できます。

XXX.inやXXX.txtを配置するディレクトリの指定は--directory
https://pip-compile-multi.readthedocs.io/en/stable/features.html#requirements-directory

*.in*.outという拡張子の指定は--in-ext--out-ext
https://pip-compile-multi.readthedocs.io/en/stable/features.html#requirements-files-extensions

pip-tools(pip-compile)同様に、バージョンアップするパッケージを指定する--upgrade-packageもサポートしています!
https://pip-compile-multi.readthedocs.io/en/stable/features.html#upgrade-only-selected-packages

pip-compile-multi verifyでXXX.inを変えた後にpip-compile-multiを流したか確認できるそうです。これも便利そう!
https://pip-compile-multi.readthedocs.io/en/stable/features.html#check-that-pip-compile-multi-was-run-after-changes-in-in-file

IMO:pip-compile-multi伸びしろ

  • pyproject.tomlは未サポート?
    • XXX.inのみサポートと思われる
    • pyproject.tomlに書いた内容を別の箇所に重複させている感覚(よりよい方法はないのだろうか)2

終わりに

pip-compile-multiを触りました。
--extraを指定した複数回のpip-compileと比べると、コマンド一発で済むのでとても簡単でした。
小さいXXX.inを組み合わせられるのもいい感じ。

XXX.in以外(pyproject.toml)もサポートしてくれたらますますいい感じかなと思います(プルリクチャンスだ!)


  1. pip-toolsの最新バージョンv7.3.0の後に追加されたようです
  2. setuptoolsの場合はdynamicにXXX.inを参照できるのですが、検証したところ、-r base.inの行がうまく動きませんでした