0.初めに
pipenvを使っていると「Pipfileでライブラリのバージョン管理を行っている」という話はよく耳にします。
じゃあ、「Pipfileに記述すればそのライブラリが使えるんだな!」とか「Pipfile.lockってよく分からないファイルもあるけど無視してヨシ!」とか考えていたんですが、そんな浅い(間違った)知識だと困る段階になってきたので自分なりにまとめてみることにしてみました。
1.pipenv の環境更新の流れ
→ Pipfile → Pipfile.lock → .venv
pipenvの環境更新はこのような流れで行われています。
「なんでこんなめんどくさいことしてるの?.venvに直接パッケージを追加すればよくない?」
という疑問については、各々の役割を考えることで解消されます。
Pipfile
仮想環境にインストールしたいパッケージをまとめて記述したものです。
ただのコンフィグファイルに過ぎないため、ここにパッケージを記述しただけでは仮想環境でそれを使うことはできません。
仮想環境で使うパッケージが一目でわかる目次的なものです。
Pipfile.lock
Pipfileの情報をハッシュ値等で保持しているものです。
Pipfileを書き換えても自動でPipfile.lockが書き換わるわけではなく(当たり前ですが)、
後述するコマンドによってPipfileからPipfile.lockが生成されます。
.venv
仮想環境にインストールしたパッケージが入っている場所です。
ここに配置されることで初めて、仮想環境でそのパッケージが使えるようになります。
後述するコマンドによって、Pipfile.lockの内容を基に.venvにパッケージがそれぞれ配置されます。
補足
この説明を最初聞いたとき「間にPipfile.lockを挟む意味ある?直接Pipfileから.venvを生成すればよくない?」って思ってたのですが、その回答としてPipfileの流動性が高いことが原因だと考えています。
Pipfileの中身を見てみると、
pandas = "==1.2.0"
numpy = "*"
という感じでライブラリのバージョン指定している箇所があります。
この場合だとpandasはバージョン1.2.0を指定しているのですが、numpyのように"*"とすると最新のバージョンをインストールするように指定ができます。
この記述は一見便利に見えますが、Pipfileを参照する時期によってライブラリのバージョンが異なってしまうということでもあります。
この特性は業務などで統一した環境を用いたいときに不便なため、その時点でのバージョンをPipfile.lockに書きだしておく必要があるのだと考えています。
2.pipenvコマンド
pipenv install
→ Pipfile → Pipfile.lock → .venv
の流れをすべて行います。
主に、仮想環境にライブラリの追加を行いたいときに使います。
pipenv install “hoge==2.0.0”
このコマンドによりPipfileにhogeライブラリのバージョン2.0.0をインストールする旨が記述され、その記述を含めたPipfileの内容で環境が生成されます。
補足
--devオプションを使うことで、開発者用の環境でのみ必要なパッケージも含めてインストールすることができます。
具体的には、通常はPipfileの[packages]で指定しているパッケージのみをインストールするのですが、このオプションがある場合は[dev-packages]で指定しているパッケージも追加でインストールします。
pytestやflake8など、開発テストやコードを書くときに必要だが動作には影響しないパッケージは[dev-packages]に記述しましょう。
pipenv update
Pipfile → Pipfile.lock → .venv
の流れを行います。(Pipfileの更新は行いません。)
Pipfileの更新自体は行っていなくても、ライブラリのバージョン指定を「*」としている場合は常に最新バージョンを取ってくるためライブラリの更新を行うことができます。
pipenv update
また、Pipfileの更新を自前で行った場合にも有効です。
pipenv sync
Pipfile.lock → .venv
の流れのみを行います。
PipfileとPipfile.lockをPJ毎に管理してこのコマンドを打つことで、PJ毎に統一された環境を作ることができます。
pipenv sync
※Pipfileのみの管理だと、前述したとおり時期によってPipfile.lockに記述されるライブラリのバージョンが揺れるのでPipfile.lockも共有する必要があります。
3.おわりに
1人で開発する際にはあまり気にする必要はないけど、チーム開発の際はPipfileとPipfile.lockの役割を理解しておかないと統一した環境で作業できないよーというお話でした。
pipenvへの理解を深めて、より良いチーム開発ライフを!
4.参考サイト