The Composer Lock File

Đối với nhiều lập trình viên PHP thì chắc hẳn sẽ không còn lạ lẫm gì với Composer – Công cụ quản lý thư viện của PHP; Và dĩ nhiên, cũng không thể không biết đến 2 file “thần thánh” là composer.jsoncomposer.lock . Tuy nhiên, có vẻ như chúng ta thường không để ý nhiều tới file composer.lock . Vậy bản chất và mục đích thực sự của file này là gì? Liệu chúng ta còn quên điều gì về nó? Bài viết này sẽ phần nào giải đáp những câu hỏi trên.

Chúng ta giả sử có một ứng dụng mới với file composer.json, trong đó có một phần nội dung như sau:

"require": {
    "php": ">=5.6.4",
    "laravel/framework": "5.3.*"
  },

Nhắc lại về composer.json. Đó là file liệt kê các dependencies của PHP cùng phiên bản tương ứng mà ứng dụng yêu cầu. Ở ví dụ này, có 2 package, trong đó package đầu là phiên bản của PHP: tối thiểu là 5.6.4 . Package thứ 2 là package của framework Laravel. Phiên bản của package này ở dạng wildcard, tức là không cần xác định chính xác phiên bản của package. Vậy câu hỏi đặt ra là : phiên bản nào sẽ được cài đặt? Đó là lúc ta cần đến file composer.lock. Sau khi chạy lệnh composer install , file composer.lock sẽ xuất hiện. Nếu mở file này ra, ta sẽ thấy file này có kích thước khá lớn so với file composer.json. Nếu composer.json là file hướng dẫn “thô” (không cụ thể) cho các dependencies mà ứng dụng cần thì file composer.lock là một bản ghi chính xác về các phiên bản của các dependencies sẽ được cài đặt. Dưới đây, ta xem xét một phần nội dung của file composer.lock ứng với file composer.json ở trên:

"name": "laravel/framework",
"version": "v5.3.29",
"source": {
    "type": "git",
    "url": "https://github.com/laravel/framework.git",
    "reference": "6fd76dec90466dc3f703d8df72e38130f2ee6a32"
},

Dễ thấy, ở file composer.lock sẽ xác định chính xác phiên bản của dependency thông qua commit hash. Ngoài ra, nó còn xác định phiên bản của tất cả những dependencies thuộc vào dependency hiện tại. Nói cách khác, cây phân lớp dependency - nắm giữ toàn bộ mối quan hệ phụ thuộc giữa các dependency mà ứng dụng cần, sẽ được được “khóa” lại tại file composer.lock. Kể từ giờ, nếu có chạy lại lệnh composer install, Composer sẽ cài đặt chính xác phiên bản của các dependencies ở file composer.lock thay vì tìm kiếm phiên bản tương thích ở file composer.json. Điều này đặc biệt có ý nghĩa khi làm việc nhóm. File lock sẽ đảm bảo tất cả các thành viên trong nhóm đều làm việc trên cùng một phiên bản dependency giống nhau.

composer update hay composer install ?

Một số người có thói quen dùng lệnh composer update khi cài đặt thêm các packages mới. Tuy nhiên, cách tiếp cận như vậy là không khuyến khích. Thay vào đó, nếu dùng lệnh composer install thì nó chỉ cài đặt những packages mới mà không cập nhật những package cũ. Vì vậy, tốc độ sẽ nhanh hơn nhiều. Cả 2 lệnh này đều tác động tới file composer.lock. Dưới đây là một số thao tác sẽ làm thay đổi file composer lock:

  • Chạy lệnh composer install lần đầu và file composer.lock được cập nhật với những phiên bản của các dependencies được cài đặt.
  • Chạy lệnh composer install sau khi thêm một package mới và phiên bản chính xác của package mới này được cập nhật vào file composer.lock.
  • Chạy lệnh composer update và tất cả packages được cập nhật lên phiên bản mới nhất dựa trên phiên bản ở file composer.json.
  • Chạy lệnh composer update package/name : cập nhật package tương ứng lên phiên bản mới nhất dựa trên phiên bản ở file composer.json.

Điều này có nghĩa composer install là lệnh “an toàn” khi chỉ thêm packages vào file composer.lock. Trong khi đó, composer update là lệnh “không an toàn” vì nó tác động trực tiếp lên các phiên bản trong file composer.lock.

Việc hiểu rõ file composer lock mang lại nhiều lợi ích. Không những giảm nguy cơ về việc xung đột phiên bản mà còn làm tăng hiệu suất lập trình lên đáng kể.

Ref: PHP: The Composer Lock File