Pythonの開発環境の管理をPipenvに任せることにした

# 概要

WindowsでPythonの開発をするにあたってパッケージの管理には非常に悩ましいところがあった。
複数人で同じ環境を作るにも手順が複雑化したりと難しい部分が多々存在する。
色々と試行錯誤したが、どれも納得のいく環境にならず諦めていたところでPipenvなるものを知り、
試してみたところ、これが非常に良かった。
まだ色々未知数ではあるが可能性を信じて後先考えずにPipenvに移行することにした。

## 色々な試行錯誤

目指すところは、誰でも簡単に同じ環境を作成できること。
そして、できれば開発にはPyCharm（Community版）を使いたい。
1. Anaconda
2. Vagrant + pyenv + venv
3. WSL + pyenv + Pipenv
4. Pipenv

### 1. Anaconda

最初はAnacondaを使い、condaに全てを任せてしまうのが良いかと考えた。
しかし、予想通りpipとの兼用にならざるを得ず、anacondaは使わない方針に切り替えることに。
（pipとcondaはパッケージ管理で競合が発生し環境が破壊される可能性がある）

### 2. Vagrant + pyenv + venv

ハンズオン等で即座に同じ環境を立ち上げたかったので試してみた。
vagrantfileのprovisionを詳細に記述することで、vagrant upを打つだけでPython開発環境ができるようになった。
ただし、CUIでの開発になるのが許容できず、GUI環境を入れてみるも時間がかかりすぎて、
気軽にvagrant upできない ＋ 仮想環境の中でのPyCharmが遅すぎで断念。
（PyCharmはPro版でないと仮想環境中のインタプリタを利用できない）

### 3. WSL + pyenv + Pipenv
WindowsなのでWSLを使う案を考えた。
動作も軽快でほぼLinuxとして使えることも良かったが、やはりPyCharmが使えない。
この辺りでPyCharmを諦めてVScodeのリモート環境への接続機能を使う手も考えた。
ただリモート接続機能を使うには「Visual Studio Code Insiders」を入れることが必須で、
今つかっているVScode(安定版)に加えて別のバージョンのVScodeを入れることに抵抗があったため、
また別の機会に利用することに決めた。
ちなみにWSLとvagrantを利用したケースは、JupyterNotebookを使うのであればローカルからアクセスできるので問題ない

### 4. Pipenv
WSLで開発環境を構築するにあたって以下の記事でPipenvというものを知った。
[2018年のPythonプロジェクトのはじめかた](https://qiita.com/sl2/items/1e503952b9506a0539ea)
Pipenvを用いることで、プロジェクト毎にパッケージのバージョンまで含めた形で環境を分離できる。
各プロジェクトに対してPipfileが作成され、Pipfileには使用するパッケージ（バージョン含む）から、
依存するPythonのバージョン、開発時の効率をあげるscriptsなどが記述される。
さらに、Pipfileで管理されるパッケージはdev環境とproduction環境で別になっており、
状況によってdev環境で必要なパッケージを入れたり、入れなかったりすることができる。
また、もしも他のメンバーが同じ環境を構築する必要があるなら、Pipfileを共有し`Pipenv install`とするだけで良い。
問題があるとすると、Windowsではpyenvが利用できないため、Pipenv単体で利用する。
そのために、Pythonの管理が若干不便になるが、Pyenvが必要になるシーンがあまり無いために問題ないと判断した。
別のバージョンのPythonが必要になった場合は、都度手動でインストールする。

### Anacondaを捨ててPipenvへ

#### Anaconda環境を捨て去る

念の為、今ある仮想環境ごとに下記コマンドでパッケージリストを保存しておく。

```
pip freeze > env_仮想環境名.txt
```

Anacondaは↓の方法２を参考に根こそぎ削除する。
[Windows10でAnaconda/Minicondaをアンインストールする方法](https://echomist.com/conda-uninstall/)
ただし、以下の場所にゴミが残っていたりするので、気になるならこちらも削除する。

```
C:\Users\<ユーザ名>\AppData\Local\conda\
```

#### Anacondaが消えたらPython環境構築

1.Pythonをインストール（pyenvが無いので手動になる）
2.pipをアップデート＆Pipenvをインストール

```
pip install --upgrade pip
pip install pipenv
```

3.Pipenvで仮想環境を作成
プロジェクトディレクトリで初期化処理

```
pipenv --python 3.7.4
```

初期化するとプロジェクトディレクトリにPipfileとPipfile.lockの2つのファイルが作成される。
また、以下の場所で仮想環境のパッケージが管理されるようになる。

```
C:\Users\<ユーザ名>\.virtualenvs\<プロジェクトフォルダ名>-xxxxx
```

あとは、pipと同様にパッケージをインストールしたりできる。

#### 基本的な使い方

パッケージのインストール

```
pipenv install <パッケージ>
```

パッケージのアンインストール

```
pipenv uninstall <パッケージ>
```

パッケージをdev環境用としてインストール

```
pipenv install --dev <パッケージ名>
```

パッケージの依存関係を表示

```
pipenv gragh
```

仮想環境の削除

```
pipenv --rm
```

Pipfileから依存パッケージをインストール

```
pipenv install
```

### 終わりに

まだ使い始めたばかりなので何か問題があれば追記したいと思う。
PipfileとPipfile.lockがそれぞれ何なのかといった疑問等あると思うが、
私もよく分かっていないので、コレについても分かり次第追記したい。

・追記
下記のサイトを参考にすると、Pipfile.lockは全てのパッケージの依存関係とバージョンを固定化(lock)したもので、
Produciton環境にリリースする場合等で用途があるようだ。
[Pipenvの基本的な使い方](https://pipenv-ja.readthedocs.io/ja/translate-ja/basics.html)

> $ pipenv lock は Pipfile.lock を作成するために使用します。 
> このファイルにはプロジェクトの 全ての 依存パッケージ (とさらにその依存パッケージ) と、
> それらの利用可能な最新のバージョン、ダウンロード済みのファイルの現在のハッシュが宣言されています。 
> このファイルのおかげで、繰り返し可能かつ、最も重要な機能である 決定論的な ビルドが保証されています。