Hướng dẫn tự động load biến từ file .env vào Makefile
Trong các dự án thực tế, thông tin cấu hình (như kết nối database, secret keys, môi trường) thường được lưu gọn gàng trong file .env. Thay vì phải khai báo lại các biến này, bạn có thể thiết lập để Makefile tự động đọc và "hấp thụ" toàn bộ nội dung của file cấu hình.
Dưới đây là 2 phương pháp phổ biến nhất để thực hiện việc này:
1. Sử dụng lệnh include (Cách cơ bản và gọn gàng nhất)
GNU Make hỗ trợ sẵn chỉ thị include, cho phép đọc nội dung từ một file khác giống như bạn đang copy-paste nội dung file đó thẳng vào Makefile.
Nội dung file .env:
DB_HOST=localhost
DB_PORT=5432
DB_USER=admin
Nội dung file Makefile:
# Kiểm tra xem file .env có tồn tại không trước khi load
ifneq (,$(wildcard ./.env))
include .env
export
endif
.PHONY: connect-db
connect-db:
@echo "Đang kết nối tới DB tại $(DB_HOST):$(DB_PORT) bằng user $(DB_USER)..."
Giải thích:
wildcard ./.env: Kiểm tra xem file có thực sự tồn tại hay không. Bước này rất quan trọng để tránh lỗi Makefile bị crash nếu source code vừa được clone về mà chưa kịp tạo file.env.include .env: Đọc toàn bộ nội dung file.export: Lệnh này đóng vai trò then chốt. Nó đẩy toàn bộ các biến vừa đọc được thành biến môi trường (environment variables) để các lệnh shell bên trong (nhưdocker compose,go run) có thể trực tiếp nhận diện và sử dụng.
2. Sử dụng Shell Command (Dành cho file .env phức tạp)
Nhược điểm của lệnh include là nó có thể báo lỗi cú pháp nếu file .env chứa các dòng comment không hợp lệ với Make hoặc các chuỗi có chứa dấu ngoặc kép phức tạp. Để xử lý triệt để, bạn có thể dùng lệnh shell để lọc dữ liệu trước khi load.
Nội dung file Makefile:
# Đọc file .env, bỏ qua các dòng bắt đầu bằng # (comment) hoặc dòng trống
export $(shell grep -v '^#' .env | xargs)
.PHONY: show-env
show-env:
@echo "Host là: $$DB_HOST"
Lưu ý khi dùng cách này:
Khi sử dụng cách đọc qua tiện ích shell, biến sẽ được nạp trực tiếp vào môi trường của terminal bên dưới. Do đó, khi in ra hoặc sử dụng trong các target của Make, bạn phải dùng cú pháp gọi biến của bash là $$TEN_BIEN thay vì $(TEN_BIEN).
💡 Khuyến nghị thực tế
Bạn nên ưu tiên Cách 1 kết hợp với việc kiểm tra file tồn tại (ifneq). Cách này giúp mã nguồn linh hoạt, dễ đọc và không báo lỗi bất ngờ khi hệ thống chạy trên môi trường CI/CD (nơi file .env vật lý thường không tồn tại mà được cấu hình qua Secret Manager).
All rights reserved