Tại sao nên đưa composer.lock vào commit của Git
Việc đưa composer.json vào trong version của Git (hay đối với bất cứ VCS nào khác như Mercurial, SVN...) là điều dễ hiểu vì file này chứa thông tin về dependency (các package) sử dụng trong dự án mà các developer khác cần phải sử dụng để cài đặt. Tuy nhiên thì tại sao chúng ta cần theo dõi cả ...
Việc đưa composer.json vào trong version của Git (hay đối với bất cứ VCS nào khác như Mercurial, SVN...) là điều dễ hiểu vì file này chứa thông tin về dependency (các package) sử dụng trong dự án mà các developer khác cần phải sử dụng để cài đặt.
Tuy nhiên thì tại sao chúng ta cần theo dõi cả tập tin composer.lock trong khi đã có composer.json?
So Sánh composer.json và composer.lock
Trong khi composer.json khai báo các dependency (PHP package) sẽ được dùng trong dự án thì composer.lock file chứa thông tin chi tiết về các dependency này sau khi chúng được cài đặt hoặc update. Các thông tin chi tiết này bao gồm phiên bản chính xác của package đã được cài đặt, thông tin về tác giả tạo ra package, giấy phép sử dụng của package, URL tải package, thời gian tải, từ khoá và mô tả package.
Một ví dụ về thông tin của package symfony/process khai báo trong composer.lock với phiên bản 2.7.23 thì sau khi cài đặt package, file composer.lock sẽ chứa các thông tin chi tiết về package này như sau:
{ "name": "symfony/process", "version": "v2.7.23", "source": { "type": "git", "url": "https://github.com/symfony/process.git", "reference": "69b111c92407c9c41d88b7f52e615e3093940712" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/process/zipball/69b111c92407c9c41d88b7f52e615e3093940712", "reference": "69b111c92407c9c41d88b7f52e615e3093940712", "shasum": "" }, "require": { "php": ">=5.3.9" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.7-dev" } }, "autoload": { "psr-4": { "SymfonyComponentProcess": "" }, "exclude-from-classmap": [ "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Symfony Process Component", "homepage": "https://symfony.com", "time": "2017-01-02 20:30:00" }
Như bạn thấy ở trên thì composer.lock chứa rất nhiều thông tin khác về package hơn là version của package và giúp chúng ta có thể biết được chính xác thì một package được tải về và cài đặt từ đâu và vào thời điểm nào...
Tuy nhiên ngoài việc cung cấp nội dung chi tiết như trên thì một phần quan trọng để bạn cần phải đưa tập tin này trong version của Git đó là bởi vì version của một số package sẽ được liệt kê theo khoảng vì dụ như từ version 2.0 tới 2.0.9. Lúc này nếu như có hai lập trình viên trong dự án và hai người cài đặt package ở hai thời điểm khác nhau thì có thể sẽ dẫn tới việc hai package được sử dụng bởi từng người sẽ khác nhau. Điều này sẽ có thể gây ra những tiềm tàng nếu như ở một version mới hơn của package, một số chức năng đã được cập nhật so với phiên bản cũ.
Kết Luận
Nếu dự án của bạn sử dụng Composer làm package manager thì bạn nên theo dõi thay đổi của không chỉ tập tin composer.json mà cả tập tin composer.lock. Một sai lầm phổ biến mà các lập trình viên PHP mắc phải đó là bỏ qua tập tin composer.lock (ví dụ như bằng cách liệt kê tập tin này trong .gitignore). Hãy lưu ý để không mắc phải sai lầm này trong các dự án tới!