Windows11環境でMakefileを使ってmakeコマンドを実行する方法 + 実例 (Docker)

# 概要
RustでWebサーバーとSurealDBのサーバーを立ててアプリケーションを作ろうと考えた時に、Dockerでコンテナを作って開発を進めたいなと思ったため、本稿を書くことになりました。

## 本稿の目的
Makefileで短縮したコマンドをmakeコマンドで実行することです

やろうとしていることは以下の通りです
- chocolateyのインストール
- chocolateyを使ってmakeのインストール
- Makefileの作成・編集
- makeコマンドの実行
- 【おまけ】Makefileに冗長なDockerコマンドを書いてDockerでの開発を楽にする

## chocolateyのインストール手順
一応makeコマンドがまだ使用できない状態をお見せします。
![1 makeコマンドが使用できない.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2701698/bc2b83d0-7df8-c23c-2718-9eb1f36c1a00.png)

では、まずはchocolateyをインストールしましょう。

1\. Powershellを**管理者権限**で開いてください。

![2 powershellを管理者権限で開く.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2701698/1639229e-74e2-f038-aea8-b35690060c1d.png)

2\. Powershellのコマンドライン上で下記のコマンドを実行しましょう。
```
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
```

コマンドプロンプトでもchocolateyのインストールはできます。
同じく管理者権限でコマンドプロンプトを開いて、下記のコマンドを実行しましょう。
```
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "[System.Net.ServicePointManager]::SecurityProtocol = 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"
```
【公式】[chocolateyのインストール手順](https://docs.chocolatey.org/en-us/choco/setup/ "chocolateyのインストール手順")


勢い余って実行してしまいましたが、これでchocolateyをインストールすることができました。
![3 chocolateyのインストール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2701698/50cce545-9ba5-daed-6a9b-1fd419f8e121.png)

![スクリーンショット 2024-07-13 190339.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2701698/052c8972-3dda-ffc8-f83f-9a327be221f2.png)


chocolateyをインストールしたため、これでchocoコマンドが使用できるようになりました。
【公式】[chocoコマンド一覧](https://docs.chocolatey.org/en-us/choco/commands/ "chocoコマンド一覧")

## makeのインストール手順
makeのインストールは、下記のコマンドを実行するだけです。
```
choco install make
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2701698/0b3f98e5-a6dc-47f5-4e0f-cf7bf55e4ed3.png)

![スクリーンショット 2024-07-13 190432.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2701698/e9c7d703-1f2a-78fc-46a0-7d1330371523.png)

## Makefileを作成・編集
### お好きなプロジェクトを開いて、Makefileを作成しましょう。

Bashの場合
```
touch Makefile
```

コマンドプロンプトの場合
```
echo > Makefile
```

Powershellの場合
```
New-Item C:\programming_directory\rust_project\simple-todo-app\Makefile -ItemType "File"
```
※みなさんの絶対パスに置換してくださいね。

私はBashでMakefileを作成しました。
![スクリーンショット 2024-07-13 194830.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2701698/e5287875-5d56-47e3-460b-34389245b4af.png)

VSCodeの拡張子もインストールしておきましょう。
![スクリーンショット 2024-07-13 195026.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2701698/0db25759-7004-b55a-456c-bddcb29611ad.png)

いくつかコマンドを書きました。
※今回はコマンドのcargo, dockerコマンドの説明は省きます。


## makeコマンドの作成
makeの後に入力したい後続のコマンドを記述してコロン (:)を付けて、実行したいコマンドを記述するだけです。

例：up: の場合は、make upでDocker上にコンテナを一気に作ります
![スクリーンショット 2024-07-13 195734.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2701698/dd7c610c-a390-70c4-8d76-4bdc1ff45696.png)

さっそく自作したmake installを実行してみましょう。(追加するクレートをいくつか減らしました)
![スクリーンショット 2024-07-13 200528.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2701698/fba92241-7759-9b43-3646-432eb803610a.png)

このように必要なクレートがインストールできていますね。
![スクリーンショット 2024-07-13 201305.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2701698/38d66ab5-6fee-455f-9b48-d3b408eec151.png)


## 【おまけ】Makefileを使って冗長なDockerコマンドを短縮しよう
最後にDockerにSurrealDBのコンテナを作成・実行し、コンテナの停止・削除を行いましょう。
※今回はMakefileの活用方法のみを紹介するため、Dockerfile・docker-compose.ymlを用意しません。

コンテナの作成・実行：`make run`
![スクリーンショット 2024-07-13 201543.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2701698/8f3ff89f-409a-2906-c16a-384347931109.png)

![スクリーンショット 2024-07-13 201553.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2701698/c0f55a5d-12f7-8919-53b6-41297f79a47d.png)

コンテナの停止・削除：`make remove`
![スクリーンショット 2024-07-13 201631.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2701698/c7e5b368-ba7c-7391-8c14-38f6002a66a2.png)

![スクリーンショット 2024-07-13 201842.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2701698/9b9d866a-8081-a8d6-1962-c060dd06d14b.png)

## 補足
### 環境変数を使用する： ${DATABASE_NAME}

Makefileは.envから環境変数を読み込んでくれるため、特定のコンテナのログだけ見たかったり、シェルを操作する時に便利です。

下記では`docker-compose logs db`を`make logs-db`に短縮して実行できるようにしています。
![Screenshot 2024-07-13 211203.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2701698/e0f89c59-acca-c7f0-d0c9-d67bd8885191.png)

### CLI上で動的に値を入力する：$(変数名)
例えば、CLI上で好きなサービスにシェルアクセスしたい時に使用します。
下記では`docker-compose exec db /bin/bash`を`make exec app=db`に短縮して実行できるようにしています。


## まとめ
- chocolateyはCLIでソフトウェアをインストール、アップデート、アンインストールするソフトウェア
- makeはソフトウェアのビルドプロセスを自動化するためのツール
- Makefileはビルドやコンパイル、実行可能ファイルの生成などの作業を自動化するためのファイル
- makeコマンドを自作することで、冗長なコマンドを短縮できる


私のGitHubにてDockerfile, docker-compose.yml, Makefileを載せていますので、必要な方はご利用ください。
[Actix Webプロジェクト](https://github.com/Ometeor-Zheero-OMZ/game-community "Actix Webプロジェクト")

最後まで読んでいただきありがとうございました！