EnvaderでPythonの環境構築を学んだのでmacOSで実践してみる(第6回)

## はじめに
はじめましてa-min3150です。エンジニアへの転職を目標に学習中です。
アウトプットのためEnvaderで学習したこと、ハマったことなどを書いていきたいと思います。

## 今回の学習内容
EnvaderでPythonの環境構築について学習したのでアウトプットします。

今回は第6回目でmacOSでの```requirements.txt```の使い方についてです。

第１回(Pythonとは)は[こちら](https://qiita.com/a-min3150/items/bf2e575668cc986dd5d9)
第２回(pyenvについて)は[こちら](https://qiita.com/a-min3150/items/56b2e9bf8957d3247d81)
第３回(pipについて)は[こちら](https://qiita.com/a-min3150/items/6d1c9b7b3b4cd5039f39)
第４回(venvについて)は[こちら](https://qiita.com/a-min3150/items/6211b80617d00284a081)
第５回(virtualenvについて)は[こちら](https://qiita.com/a-min3150/items/76ab94d98b1292e1c8f7)
第７回(git cloneの使い方)は[こちら](https://qiita.com/a-min3150/items/bf8d062a3ab474523e7d)

## requirements.txtとは

第３回目のpipの使い方の時にも出てきた```requirements.txt```ですがこれは「パッケージの名前とバージョンの一覧の控えを取っておく」ものであると解説しました。

## いつ使うのか?
GitHubに共有したり、本番環境に反映させるときなどに、パッケージの名前とバージョンも共有しておく必要がある場合にrequirements.txtが利用されます。

共有しないと環境が変わった時にいちいちバージョンを確認して一つずつインストールしたり、正常に動作しなかったりと様々な問題が発生しかねません。

パッケージによっては、他のパッケージのあるバージョンには対応しておらず、アップデートしたときに正常に動作しない場合もあるため、正常に動作したときのバージョンで必ず作成しておきましょう。
(ファイル名は特に決まってないですが、基本的には**requirements**という名前が使用されます)


## ファイルの作成
ターミナルでファイルを作成したディレクトリに移動してコマンドを実行します。

pip freeze > の後にrequirements.txtとすることでファイルを作成できます。

```
$ pip freeze > requirements.txt
# requirements.txt の中身
alembic==1.7.5
app==0.0.1
bcrypt==3.2.0
captcha==0.3
certifi==2021.10.8
cffi==1.15.0
charset-normalizer==2.0.9
virtualenv<20.10.0, >19.0.0
・・・・・・
```
バージョンを指定しない場合はインストールするときに最新版がインストールされます。
==, >= , >, <=, <, != などでバージョンを指定し、カンマで区切ることでAND 条件を指定し二つのバージョンをインストールできます。

## ファイルのインストール
他の環境に移した時やcloneしたとき、バージョンを以前の状態に戻したいときにrequirements.txtをインストールします。

```pip install``` の後に ```-r``` オプションと ```requirements.txt```とすることでパッケージと指定したバージョンを一括でインストールできます。
```
$ pip install -r requirements.txt
```

## macOSで実践してみる
[第３回目](https://qiita.com/a-min3150/items/6d1c9b7b3b4cd5039f39)の時にFlaskをインストールした時に作成した```requirements.txt```があるのでこれを別のディレクトリにコピーして中身のパッケージをインストールしてみましょう。
デスクトップ上に「test」というディレクトリを作成し、そこに移動する。
```
 macOS:Desktop user$ mkdir test && cd $_
```
```cp```コマンドを使って第３回目で作ったディレクトリの中から```requirements.txt```を「test」ディレクトリへコピーする。
(```cp```コマンドの使い方については[こちら](https://qiita.com/a-min3150/items/9458e8ee450966eb749f))
```
 macOS:test user$ cp ../test_venv/requirements.txt ./
 macOS:test user$ ls
requirements.txt
```
requirements.txtの中身を確認する。
```
macOS:test user$ cat requirements.txt 
click==8.1.2
Flask==2.0.3
itsdangerous==2.1.2
Jinja2==3.1.1
MarkupSafe==2.1.1
Werkzeug==2.1.1
```
仮想環境を起動する。(今回は```venv```)
```
macOS:test user$ python -m venv venv//「venv」という仮想環境を作成。
macOS:test user$ ls//「venv」というディレクトリが作成されたことを確認する。
requirements.txt	venv
macOS:test user$ source venv/bin/activate//仮想環境を起動する。
(venv) macOS:test user$ //(venv)となり、起動できた
```
仮想環境を起動した状態で```requirements.txt```をインストールすることで特定のディレクトリのみにインストールされるため、システム全体に影響しないようになります。
```
(venv) macOS:test user$ pip install -r requirements.txt 
```
```pip list```でインストールされたものを確認する。
```
(venv) macOS:test user$ pip list
Package      Version
------------ -------
click        8.1.2
Flask        2.0.3
itsdangerous 2.1.2
Jinja2       3.1.1
MarkupSafe   2.1.1
Werkzeug     2.1.1
```
このようにrequirements.txtファイルを使ったインストールを行えるようになれば、チーム開発をする時に他の人が作った環境をそのまま自身のPCへ作ることができるようになるので大変便利です。

## まとめ
今回はrequirements.txtファイルについて解説しました。

ファイルの作成
```
$ pip freeze > requirements.txt
```
ファイルのインストール
```
$ pip install -r requirements.txt
```
とても大事なファイルなので、しっかりと使い方や役割を覚えておきましょう。

次回は[git cloneの使い方](https://qiita.com/a-min3150/items/bf8d062a3ab474523e7d)についてです。

## 引用サイト
- Envader(エンベーダー):https://envader.plus/
- コース一覧:https://envader.plus/course
- Python環境構築コース:https://envader.plus/course/8
- 今回解説したコースシナリオ:https://envader.plus/course/8/scenario/1073