---
# System prepended metadata

title: Makefile

---

# Makefile

## 教學 
https://blog.goodjack.tw/2023/01/use-makefile-to-manage-workflows-for-web-projects.html

```typescript
# 新增變數變給定預設值
CONTAINERS ?= workspace mysql
IS_ROOT ?= false
ENVIRONMENT ?= dev
MYIP = ${shell curl -s ipinfo.io/ip}
# 這些 target 不需要跳過
# PHONY 是 makeFile 保留字
.PHONY: up stop zsh

# make up 先執行 .env stage 如果有 .env 的檔案該 stage 就不會被執行。
# .env 同時是 stage name 跟 file name
up: .env
# ${info 你要顯示得內容} 這是 make file 的 logger 用法 ， $@ 表示當前的 stage
	${info 目前環境為 ${ENVIRONMENT}}
	$(info 目前執行的 Target 是 $@) 
	$(info 啟動 workspace)
	@echo finish up stage
# 或是在各的 target 宣告 .PHONY 
.PHONY: up 

down:
	docker compose down
.PHONY: down

zsh:
	docker compose exec  workspace zsh

.env:
	${info .env 檔案不存在建立 .env 檔案}
ifeq (${ENVIRONMENT},dev)
	cp .env.example .env
else
	cp .env.example.production .env
endif
	

test_variable:
	@echo ${CONTAINERS}

condition:
ifeq ($(IS_ROOT),true)
	@echo IS_ROOT is auth
else
	@echo IS_ROOT is not auth 
endif
.PHONY: condition

	

ip:
	${info 我的 ip: ${MYIP}}
.PHONY: ip

# :: 可以拆分 stage
prerequisite::
	${info 我先執行這邊}
prerequisite::
	${info 在執行這邊}
.PHONY: prerequisite

test: .AAA
	@echo 1

.AAA:
	@echo AAA	
```