1 điểm bởi GN⁺ 2024-09-22 | 2 bình luận | Chia sẻ qua WhatsApp
  • 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ạy make hoặc make build, rồi chạy make 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ển
    • build: 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, deploy hoặc encrypt, 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, Gradle v.v.

2 bình luận

 
kayws426 2024-09-22

Tôi thích Makefile

Nếu một makefile không định nghĩa các dependency, thì thay bằng justfile sẽ mang lại trải nghiệm sử dụng tốt hơn.

 
GN⁺ 2024-09-22
Ý kiến Hacker News
  • Khuyến khích dùng Make

    • Có ý kiến cho rằng đừng nản lòng nếu bạn dùng Make chưa đúng cách
    • Điểm mạnh của Make là sự đơn giản, và với các dự án nhỏ thì đó không phải vấn đề lớn
    • Trong đa số trường hợp, không cần quá bận tâm về cách làm đúng; độ phức tạp chỉ được thêm vào khi cần
  • Vấn đề của Makefiles

    • Makefiles tuy đỡ tệ hơn nhiều hệ thống build khác, nhưng vẫn có khá nhiều vấn đề
    • Các vấn đề chính của hệ thống build:
      • Quá cơ bản: với dự án phức tạp dễ trở nên rối rắm
      • Quá phức tạp: đòi hỏi quá nhiều kiến thức ban đầu và công sức quản lý
      • Thiếu thư viện chuẩn: mọi thứ đều phải tự định nghĩa
      • Quá hạn chế: khi nhu cầu thay đổi thì phải chuyển sang hệ thống khác
      • Quá nhiều ma thuật: đặc trưng của những hệ thống thiết kế kém
      • Cú pháp khó hiểu hoặc thiếu nhất quán
  • Ưu điểm của Make

    • Ý kiến từ một người thích Make
    • Make là một DSL đơn giản, gồm tập hợp các lệnh để biến đổi tệp
    • Có thể làm điều đó bằng Bash hay shell khác, nhưng Make đơn giản hơn
  • Sử dụng target PHONY

    • Không dùng cơ chế theo dõi phụ thuộc dựa trên mtime
    • Cần định nghĩa target là PHONY
    • Gần đây chuyển sang dùng just và justfiles để đơn giản hơn
  • Tranh luận sôi nổi về Make

    • Make khơi ra tranh cãi giống như cuộc chiến vi-vs-emacs
    • Dùng Makefile làm driver hệ thống build cấp cao nhất là một lựa chọn thông minh
    • Ngay cả khi dùng công cụ build khác, vẫn có thể chuẩn hóa bằng Makefile
  • Nhiều cách tận dụng Make

    • Dùng Make để tự động hóa nhiều loại công việc khác nhau
    • Dùng Makefile để build và triển khai website cá nhân
    • Gọi Make thông qua Git push và Git hook
    • Dùng Makefile để tải lên và quản lý tệp PDF
  • Giới hạn của Make và các lựa chọn thay thế

    • Make ổn khi làm trình chạy tác vụ, nhưng có những lựa chọn tốt hơn
    • Make/Makefiles không được tiêu chuẩn hóa
    • Không thể giải quyết phụ thuộc, cần script configure
    • Dùng mtime để kiểm tra đầu vào có mới nhất hay không, nhưng có thể gây ra vấn đề
    • Được thiết kế theo triết lý Unix, nhưng có giới hạn với các hệ thống build hiện đại
  • Chuyển sang Justfiles

    • Chuyển sang Justfiles để tránh sự phức tạp của Makefile
  • Cách dùng Makefile đơn giản

    • Có ý kiến ủng hộ cách dùng Makefile thật đơn giản
    • Có thể chia sẻ mà không cần học mọi thứ một cách hoàn hảo
    • Chia sẻ trải nghiệm GitLab CI pipeline đã thay thế Makefile