Tôi thích Makefile
(switowski.com)-
Tôi thích Makefile. Tôi đã dùng nó hơn 10 năm rồi. Ngay từ khi đó, nó đã trông như một công nghệ cũ. Theo thời gian, nhiều công cụ build mới xuất hiện rồi biến mất, nhưng Makefile vẫn tiếp tục được sử dụng. Trong quá trình tham gia các dự án, tôi dần trở nên quen thuộc với nó và đến một lúc nào đó thì bắt đầu thích nó. Hiện nay, đây là công cụ tự động hóa đầu tiên tôi dùng khi bắt đầu một dự án mới.
-
Lý do tôi thích Makefile là vì nó tuân theo những quy ước không chính thức để triển khai cùng một bộ lệnh. Khi tiếp cận một dự án mới, nếu thấy có tệp
Makefile, tôi sẽ chạymakehoặcmake build, rồi chạymake installđể build và thiết lập dự án. Hoặc ít nhất tôi cũng có thể biết thêm thông tin về các bước bổ sung. -
Tôi cũng cố gắng áp dụng cùng quy ước đó trong các dự án của mình. Khi mở lại một thư mục dự án cũ và chạy
make dev, nó sẽ thực hiện mọi bước cần thiết để build dự án và chạy máy chủ phát triển. Vì tôi đã dùng nhiều công nghệ khác nhau nên mỗi công nghệ lại có các lệnh khác nhau. Với Makefile, ngay cả những dự án tôi không đụng đến trong nhiều tháng hoặc nhiều năm cũng có thể được quản lý dễ dàng. -
Makefile rất đơn giản. Tôi không dùng câu lệnh điều kiện, cờ hay các tính năng phức tạp khác. Phần lớn công việc chỉ gồm một hoặc nhiều lệnh shell. Tôi cũng có thể viết một script bash với vài hàm, nhưng Makefile dễ viết hơn và nhanh hơn.
-
Hầu hết các dự án cá nhân của tôi đều có những tác vụ phổ biến như sau:
dev: khởi động máy chủ phát triểnbuild: build dự án (nếu có bước build)deploy: triển khai/xuất bản dự án
-
Blog này có một Makefile đơn giản chỉ với một target:
dev: npm run dev -
Với các dự án phức tạp hơn, tôi dùng Makefile như sau:
# Chạy máy chủ phát triển dev: bundle exec jekyll serve --unpublished -w --config _config.yml,_config-dev.yml --livereload # Build tài nguyên build: npm run gulp build # Theo dõi thư mục cụ thể và xử lý tài nguyên watch: npm run gulp watch -- --wip # Build website cục bộ, mã hóa và triển khai lên máy chủ Netlify deploy: JEKYLL_ENV=production bundle exec jekyll build; \ make encrypt; \ netlify deploy --prod # Mã hóa thư mục "_site" encrypt: npx staticrypt _site/*.html -r -d _site -
Trong ví dụ trên, tôi đang bỏ qua sự tồn tại của các phony target. Nếu có tệp tên là
dev,build,watch,deployhoặcencrypt, Makefile có thể sẽ không hoạt động như mong đợi. -
GNU Make rất phổ biến. Trên Linux, khả năng cao là nó đã được cài sẵn. Trên MacBook, tôi cũng không nhớ đã từng cài nó một cách rõ ràng. Có lẽ nó đã được cài cùng với công cụ khác. Make đơn giản và có ít phụ thuộc bổ sung hơn so với các công cụ build khác. Điều này có thể hữu ích trong những môi trường bị giới hạn. Khả năng cao là Make đã có sẵn. Nếu không, bạn vẫn có thể chạy thủ công các lệnh trong Makefile bằng shell.
-
Tôi không phản đối các công cụ build khác. Mỗi khi phát hiện ra một công cụ build mới, tôi vẫn thấy hứng thú. Nhưng tôi vẫn dùng Make để quản lý nhiều công cụ khác nhau.
Tóm tắt của GN⁺
- Makefile giúp việc quản lý dễ dàng hơn nhờ cung cấp một bộ lệnh nhất quán trên nhiều dự án khác nhau.
- Với cú pháp đơn giản và ít phụ thuộc, nó cũng hữu ích trong các môi trường bị hạn chế.
- Có thể dùng cùng nhiều công cụ build khác nhau nên tính linh hoạt cao.
- Các công cụ có chức năng tương tự gồm
CMake,Ninja,Gradlev.v.
2 bình luận
Tôi thích Makefile
Nếu một
makefilekhông định nghĩa các dependency, thì thay bằngjustfilesẽ mang lại trải nghiệm sử dụng tốt hơn.Ý kiến Hacker News
Khuyến khích dùng Make
Vấn đề của Makefiles
Ưu điểm của Make
Sử dụng target PHONY
Tranh luận sôi nổi về Make
Nhiều cách tận dụng Make
Giới hạn của Make và các lựa chọn thay thế
Chuyển sang Justfiles
Cách dùng Makefile đơn giản