はじめに
Python のライブラリをインストールするときに使用する pip に、バージョン 7.1 からある機能が追加されました。
Constraints File と呼ばれるその機能は、あまり有名ではありませんが、使い方によっては非常に便利な機能です。
Constraints File の機能
Constraints File と Requirements File の機能は非常によく似ており、そのフォーマットはまったく同一です。
違いはただ一点、Constraints File はバージョンを制御するだけで、記述したライブラリがインストールされることはありません。
例えば、次のようなファイルがあったとき
werkzeug=== 0.11.1
次のように Requirements File として使用すると、werkzeug 0.11.1 がインストールされます。
pip install -r werkzeug.txt # 0.11.1 がインストールされる
対して、Constraints File としてしていしても、werkzeug がインストールされることはありません。
pip install -c werkzeug.txt # なにもインストールされない
ですが、次のように引数と併用することで、インストールするバージョンを制御することが出来ます。
pip install werkzeug -c werkzeug # 0.11.1 がインストールされる
また、Requirements File と Constraints File を併用することも出来ます。
まとめると、以下のようになります。
$ pip install -r werkzeug.txt # 指定したバージョンがインストールされる
$ pip install -c werkzeug.txt # なにもインストールされない
$ pip install -r werkzeug.txt -c werkzeug.txt # 指定したバージョンがインストールされる
$ pip install werkzeug -c werkzeug.txt # 指定したバージョンがインストールされる
Constraints File の便利な使い方
Constraints File は、Requirements File と組み合わせることで真価を発揮します。
よくある Requirements File の使い方は、pip freeze
の出力をそのまま書き込む、というものでした。しかし、この方法では、インストールしたライブラリと、そのライブラリの依存ライブラリを区別することが出来ません。
たとえば、A というライブラリが、B 及び C というライブラリに依存していたとします。そのとき、A をインストールした後に pip freeze すると、B 及び C まで出力され、それらを区別する方法はありません。
$ pip install A
$ pip freeze
A==1.0.0
B==1.0.0
C==1.0.0
ここで、直接依存するライブラリのみを Requirements File に記述し、pip freeze
の結果を Constraints File に記述することで、直接依存しているライブラリと、間接的に依存しているライブラリを区別することが出来ます。
$ cat requirements.txt
A
$ cat constraints.txt
A==1.0.0
B==1.0.0
C==1.0.0
$ pip install -r requirements.txt -c constraints.txt
まとめ
本記事では、Constraints File について紹介しました。
まだまだ新しい機能ですので、ここで紹介した使い方以外にも、もっと便利な使い方ができるかもしれません。もしそんな便利な使い方を発見したら、是非教えていただけるとうれしいです。