0

cách kiểm tra và báo lỗi trong Makefile nếu một biến quan trọng từ file .env bị rỗng hoặc chưa được khai báo.

Ép Makefile kiểm tra cấu hình: 3 Cách chặn đứng lỗi thiếu biến .env

Để đảm bảo an toàn và tránh việc hệ thống kết nối sai hoặc chạy lỗi do thiếu cấu hình, bạn hoàn toàn có thể ép Makefile kiểm tra sự tồn tại của các biến này trước khi thực thi.

Trong GNU Make, hàm $(error ...) là công cụ đắc lực nhất để làm việc này. Khi gặp hàm này, Makefile sẽ lập tức in ra câu thông báo lỗi của bạn và dừng toàn bộ tiến trình.

Dưới đây là 3 phương pháp kiểm tra từ cơ bản đến nâng cao:


1. Kiểm tra ở mức toàn cục (Global Check)

Cách này sẽ kiểm tra biến ngay khi bạn gõ bất kỳ lệnh make nào. Phù hợp cho những biến sống còn (như ENV, PROJECT_NAME) mà mọi lệnh đều cần.

Trong file Makefile:

# Đọc file .env
-include .env
export

# Kiểm tra xem biến có rỗng không
ifeq ($(DB_HOST),)
$(error LỖI TÀI KHOẢN: Biến DB_HOST đang bị trống hoặc chưa được khai báo trong file .env!)
endif

.PHONY: run
run:
	@echo "Đang chạy ứng dụng với DB: $(DB_HOST)"

Lưu ý: Dùng ifeq ($(BIEN),) sẽ bắt được cả 2 trường hợp: biến chưa khai báo hoặc biến đã khai báo nhưng để trống (ví dụ DB_HOST=).


2. Kiểm tra bên trong từng Target cụ thể

Đôi khi, bạn chỉ cần biến AWS_SECRET_KEY khi chạy lệnh make deploy, còn lệnh make build thì không cần. Lúc này, bạn có thể kiểm tra bằng lệnh if của Bash bên trong target.

Trong file Makefile:

-include .env
export

.PHONY: deploy
deploy:
	@if [ -z "$(AWS_SECRET_KEY)" ]; then \
		echo "❌ LỖI: Lệnh deploy yêu cầu phải có AWS_SECRET_KEY trong .env"; \
		exit 1; \
	fi
	@echo "Bắt đầu deploy lên AWS..."

(Lệnh exit 1 báo cho terminal biết tiến trình đã thất bại, Makefile sẽ lập tức dừng lại).


3. Tạo mẫu kiểm tra tự động (Pattern Rule) - Khuyên dùng cho dự án lớn

Nếu bạn có hàng chục biến cần kiểm tra, việc viết if-else nhiều lần sẽ làm Makefile rất rối. Bạn có thể sử dụng cú pháp dấu % để tạo một target chuyên làm nhiệm vụ "bảo vệ" (guard).

Trong file Makefile:

-include .env
export

# Hàm bảo vệ: Bất kỳ target nào có tiền tố guard- đều sẽ lọt vào đây
guard-%:
	@if [ -z "${${*}}" ]; then \
		echo "❌ LỖI CẤU HÌNH: Bắt buộc phải khai báo biến $* trong .env!"; \
		exit 1; \
	fi

# Yêu cầu phải có DB_USER và DB_PASS trước khi chạy migrate
.PHONY: db-migrate
db-migrate: guard-DB_USER guard-DB_PASSWORD
	@echo "Đang chạy migrate database cho user $(DB_USER)..."

Cách hoạt động:

Khi bạn gọi make db-migrate, nó sẽ nhìn thấy 2 điều kiện tiên quyết là guard-DB_USERguard-DB_PASSWORD. Dấu % sẽ lần lượt nhận giá trị là DB_USERDB_PASSWORD, tự động kiểm tra xem các biến này có trống không. Nếu 1 trong 2 bị trống, lệnh migrate sẽ bị chặn đứng ngay lập tức.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí