はじめに
解釈一致!! nikkieです😭
先日pip-toolsを触りましたが、
関連するpip-compile-multiを今回触りました。
目次
- はじめに
- 目次
- pip-compile-multiとは
- pip-compile-multiの使い方
- 自作ライブラリに導入して手を動かす
- pip-compile-multi ドキュメント読みメモ
- IMO: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
でインストールできます
使い方(導入方法)
-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
-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)もサポートしてくれたらますますいい感じかなと思います(プルリクチャンスだ!)
- pip-toolsの最新バージョンv7.3.0の後に追加されたようです↩
-
setuptoolsの場合はdynamicにXXX.inを参照できるのですが、検証したところ、
-r base.in
の行がうまく動きませんでした↩