個人的な備忘録：requirements.txtについて3時間語れなかったので、記事としてアウトプットして振り返ってみた

## はじめに

Pythonプロジェクトでは、他の開発者や異なる環境で再現可能な開発環境を構築することが非常に重要です。

:::note info
**そのために活用されるのが「**requirements.txt**」です。**
:::

***このファイルを使えば、必要なライブラリやそのバージョンを簡単に共有できるため、プロジェクト運営をスムーズに進めることができます。***

## 書こうと思ったきっかけ
ITスクールのハッカソンに参加した際、PythonのFlaskを使う要件がありました。***その中で、ライブラリ管理がうまくいかず、異なる環境で「自分のコードが動かない」という問題が発生しました。***

:::note warn
**また、初心者の頃は `pip install` コマンドを使ってライブラリをインストールするだけで済ませていたため、適切な管理方法について改めて学ぶ必要性を感じました。**
:::

さらに、最近Go言語について学び始めたところ、Pythonの `requirements.txt` と Goの `go.mod` が似ていることに気づき、これを記事にまとめたいと思いました。

https://qiita.com/free-honda/items/004d41ae0e42aafe0469

## そもそも、requirements.txtとは？
`requirements.txt` は、Pythonプロジェクトで必要なライブラリとそのバージョンを記載するためのファイルです。

:::note info
***このファイルを使うことで、プロジェクトで必要な環境を他の開発者や異なる環境で簡単に再現することができます。***
:::

**詳しく知りたい方には、以下の記事が参考になります：**

https://envader.plus/course/8/scenario/1073


## 基本的な書き方

**ライブラリ名のみを指定する場合**

ライブラリ名だけを記載するシンプルな方法です。

```requirements.txt
requests
numpy
flask
```

**バージョンを指定する場合**

バージョンを指定することで、必要なライブラリのバージョンを固定または範囲で管理できます。

```requirements.txt
requests==2.28.2  # このバージョンを固定
numpy>=1.21.0    # このバージョン以上を許容
flask<2.1        # このバージョン未満
```

**コメントを記載する場合**

`#` を使うことで、説明や補足を記載できます

```requirements.txt
requests==2.28.2  # HTTPリクエスト用のライブラリ
flask==2.0.3      # Webアプリケーションフレームワーク
```

**他のファイルを参照する場合**

`-r` オプションを使えば、他の `requirements.txt` を参照して内容を引き継ぐことが可能です。

```requirements.txt
-r base-requirements.txt
```

## 実際に書いてみた
以下は、Flaskを使ったプロジェクトでの `requirements.txt` の例です。

```requirements.txt
# requirements.txt
Flask==2.0.3         # Webアプリケーションフレームワーク
Jinja2>=3.0          # テンプレートエンジン
Werkzeug<2.1         # WSGIツールキット
requests==2.28.2     # HTTPリクエストライブラリ
```

### ライブラリのインストール

上記の `requirements.txt` に記載されたライブラリをインストールするには、以下のコマンドを実行します。

```requirements.txt
pip install -r requirements.txt
```

なお、ここではサンプルとして `requirements.txt` の内容を以下のように簡略化しています。

```requirements.txt
requests==2.28.2
```


**実際のコマンド結果**

以下は、コマンド実行時の結果例です。

```bash
➜  python git:(main) ✗ pip install -r requirements.txt
Collecting requests==2.28.2 (from -r requirements.txt (line 1))
  Downloading requests-2.28.2-py3-none-any.whl.metadata (4.6 kB)
Requirement already satisfied: charset-normalizer<4,>=2 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from requests==2.28.2->-r requirements.txt (line 1)) (3.4.0)
Requirement already satisfied: idna<4,>=2.5 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from requests==2.28.2->-r requirements.txt (line 1)) (3.4)
Collecting urllib3<1.27,>=1.21.1 (from requests==2.28.2->-r requirements.txt (line 1))
  Downloading urllib3-1.26.20-py2.py3-none-any.whl.metadata (50 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 50.1/50.1 kB 2.5 MB/s eta 0:00:00
Requirement already satisfied: certifi>=2017.4.17 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from requests==2.28.2->-r requirements.txt (line 1)) (2023.7.22)
Downloading requests-2.28.2-py3-none-any.whl (62 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 62.8/62.8 kB 6.3 MB/s eta 0:00:00
Downloading urllib3-1.26.20-py2.py3-none-any.whl (144 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 144.2/144.2 kB 11.4 MB/s eta 0:00:00
Installing collected packages: urllib3, requests
  Attempting uninstall: urllib3
    Found existing installation: urllib3 2.0.7
    Uninstalling urllib3-2.0.7:
      Successfully uninstalled urllib3-2.0.7
  Attempting uninstall: requests
    Found existing installation: requests 2.32.3
    Uninstalling requests-2.32.3:
      Successfully uninstalled requests-2.32.3
Successfully installed requests-2.28.2 urllib3-1.26.20

[notice] A new release of pip is available: 24.0 -> 25.0
[notice] To update, run: pip install --upgrade pip
```

現在の仮想環境にインストールされているライブラリを `requirements.txt` に出力するには、以下のコマンドを実行します。

```bash
pip freeze > requirements.txt
```

このように、`requirements.txt` を正しく活用することで、チーム開発やデプロイ時に発生しがちなトラブルを未然に防ぎ、作業をスムーズに進めることが可能です。

## まとめ
最後までお読みいただき、ありがとうございました。

:::note info
**今回は基礎的な内容ではありますが、`requirements.txt`について自分なりに整理し、言語化することで理解を深めることができました。**
:::

***これからも、このような基本的な内容を丁寧にまとめ、知識を定着させていきたいと思います。***