composer.lock in Laravel

Như chúng ta đã biết thì Composer là một công cụ để quản lý các dependency trong các ứng dụng php. Nó cho phép chúng ta khai báo các thư viện trong các dự án của chúng ta và nó sẽ quản lý việc install hay update các thư viện mà chúng ta đã khai báo. Ở trong các ứng dụng Laravel thì chúng ta thường để ý đến file composer.json. Vậy đã bao giờ bạn để ý đến file composer.lock hay chưa.

composer.lock là gì ?

Đơn giản composer.lock là một file cho composer biết chính xác version từng package đã được sử dụng và cài đặt, ví dụ mình cài package như sau:

Sau khi cài đặt xong thì các bạn kiểm tra trong file composer.json thì ở require sẽ thấy package mà chúng ta đã cài đặt:

Trong file composer.json chỉ cho chúng ta biết được sơ bộ về version của package mà chúng ta đã sử dụng. Còn ở file composer.lock sau khi chúng ta cài đặt package đó sẽ như sau:

Trong file composer.lock chúng ta sẽ biết được chi tiết về version mà chúng ta đang sử dụng là "7.3.0" và thông tin về package mà bạn đã cài đặt trong file này, như là về thời gian, provider, về các require để có thể cài đặt được package. Ngoài ra còn có reference chính là commitId.

composer.lock được sinh ra khi nào ?

Khi cài đặt project laravel thì chúng ta sẽ có file composer.lock. Nếu như project của chúng ta chưa có file này mà chỉ có composer.json thì khi chạy composer install thì file composer.lock sẽ được sinh ra.

Tại sao composer.lock lại quan trọng ?

Khi bạn cài đặt thì composer sẽ ưu tiên composer.lock hơn so với file composer.json. Nếu file lock chưa tồn tại thì composer sẽ trỏ đến file json để cài đặt các dependencies và các version mới nhất. Giả sử trong dự án của bạn không có file composer.lock hay repository của team bạn không commit file composer.lock lên VCS(version control system). Việc này sẽ ảnh hưởng như thế nào đến dự án?

Khi có một thành viên mới tham gia dự án hay chúng ta auto deploy sử dung VCS của bạn. Sau khi clone và thực hiện việc cài đặt các dependencies, thực hiện test một số chức năng bị fail hoặc có thể ứng dụng bị lỗi. Và sau đó thực hiện debug code xem lỗi xuất phát từ đâu. Sau một hồi thì biết được lỗi này không xuất phát từ code mà nguyên nhân là do version của dependencies mà chúng ta đã cài đặt. Vậy nguyên nhân của việc này như thế nào?

Việc chúng ta không commit file composer.lock trong dự án mà chỉ có file composer.json, do đó khi cài đặt dependencies thì composer composer.json. Ở trong file composer.json chúng ta cài đặt một package ví dụ là package-A: 1.1* thì khi chúng ta chạy lệnh composer install thì composer sẽ cài đặt cho chúng ta version mới nhất của package đó. Nhưng ở trong dự án thì team lại sử dụng package A này ở version 1.1.2 dẫn tới việc test fail và có thể gây lỗi trên production.

Vậy làm sao để khắc phục được điều này?

Đơn giản là chúng ta commit file composer.lock lên VCS repository của team. Và ở đây có nhiều bạn sẽ thắc mắc là tại sao dựa vào file composer.lock thì chúng ta có thể cài đặt đúng version của package mà cả team đang sử dụng.

Chúng ta để ý vào mỗi một package khi được cài đặt thì trong file composer.lock sẽ có đầy đủ thông tin về package đó và kèm theo một reference chính là commit id thực tế để khi việc cài đặt các dependencies sẽ đúng với version mà cả team đang sử dụng.

Và trên đây là tất cả những tính năng quan trọng của file composer.lock, đảm bảo việc đồng bộ version các dependencies giữa các member trong dự án và các môi trường.