just: gom lệnh của project vào justfile, đơn giản hơn Makefile
Tóm tắt
just lưu lệnh project trong justfile với cú pháp giống Make nhưng không cần .PHONY, có tham số, phụ thuộc, [confirm] cho lệnh nguy hiểm và just --list làm tài liệu. Dùng cùng recipe cho dev và CI.
Mỗi project có một bộ lệnh lặp đi lặp lại: chạy test, lint, build Docker, migrate database, deploy staging. Nhiều team nhét chúng vào Makefile, rồi vấp phải cú pháp tab bắt buộc, .PHONY, và việc Make vốn sinh ra để build file chứ không phải chạy lệnh. Số khác để rải rác trong README mà không ai cập nhật. just là "command runner": lưu các lệnh (gọi là recipe) trong file justfile với cú pháp giống Make nhưng đơn giản hơn, chạy bằng just tên-recipe.

Cài đặt
brew install just # macOS
cargo install just # có Rust
winget install --id Casey.Just --exact # Windows
sudo apt install just # Ubuntu 24.04 trở lên
Justfile đầu tiên
Tạo file justfile ở gốc project:
# Đọc biến từ file .env
set dotenv-load
image := "myapp"
version := `git rev-parse --short HEAD`
# Recipe đầu tiên là mặc định khi gõ `just`
default:
@just --list
# Cài dependency
install:
npm ci
# Chạy test, truyền thêm tham số tuỳ ý
test *args:
npm test -- {{args}}
# Build image, phụ thuộc vào test
build: test
docker build -t {{image}}:{{version}} .
# Deploy, có tham số với giá trị mặc định và hỏi xác nhận
[confirm("Deploy thật chứ?")]
deploy env="staging": build
./scripts/deploy.sh {{env}} {{image}}:{{version}}
just # hiện danh sách recipe kèm comment
just test --watch # truyền tham số
just deploy prod # chạy test → build → hỏi xác nhận → deploy prod
Vì sao không dùng Make?
| Tiêu chí | Make | just |
|---|---|---|
| Mục đích gốc | Build file dựa trên thời gian sửa | Chạy lệnh |
.PHONY | Cần khai báo | Không cần |
| Tham số | Qua biến, khá vụng | Tham số có tên, giá trị mặc định, biến thiên số lượng |
| Liệt kê lệnh | Phải tự viết | just --list có sẵn, lấy comment làm mô tả |
| Báo lỗi | Khi chạy tới | Recipe hay biến không tồn tại bị báo trước khi chạy |
| Đa nền tảng | Khó trên Windows | Chạy trên Linux, macOS, Windows |
Tính năng đáng biết
- Recipe viết bằng ngôn ngữ khác: dòng đầu là shebang (
#!/usr/bin/env python3) thì cả recipe chạy như một script Python. - Đổi shell:
set shell := ["bash", "-uc"]. - Chạy từ thư mục con: just tự tìm
justfileở thư mục cha, nên gõjust testở đâu trong project cũng được. - Ẩn lệnh khi in: thêm
@trước dòng để không in lại lệnh trước khi chạy. - Thuộc tính:
[confirm]hỏi trước khi chạy,[private]ẩn khỏi danh sách,[linux]/[macos]/[windows]cho recipe theo hệ điều hành.
Lưu ý
- just không theo dõi file đã build hay chưa; mỗi lần gọi là chạy lại. Nếu cần build tăng dần, vẫn dùng công cụ build chuyên dụng.
- Mỗi dòng của recipe chạy trong một shell mới; biến shell và
cdkhông giữ giữa các dòng. Cần giữ trạng thái thì dùng recipe shebang. - Thụt lề trong recipe có thể dùng tab hoặc dấu cách, nhưng phải thống nhất trong một recipe.
Áp dụng thế nào?
- Dev: Gom mọi lệnh hay dùng của project vào justfile; người mới chỉ cần gõ
justđể biết project chạy thế nào. - Tech Lead: Cho CI gọi cùng recipe với máy dev (
just test,just build) để hết cảnh "CI chạy khác máy tôi". - PM: justfile là tài liệu sống về quy trình kỹ thuật của project, luôn đúng vì chính nó được chạy hằng ngày.
Nguồn & tham khảo
- casey/just — casey (GitHub)