Composer — всё дело в lock файле

Composer давно и, видимо, надолго занял твердое место в качестве менеджера пакетов для PHP. Он довольно прост, эффективен и встречается повсеместно.

Известно, что достаточно создать файл composer.json, в котором просто перечислить список необходимых пакетов и их версий и запустить composer install.

Потом просто сохраняете вашу версию в систему контроля версий, и любой человек работающий с вами в команде просто выполняет composer install и получает проект со всеми установленными зависимостями.

Чтобы обновить все зависимости вашего проекта достаточно выполнить composer update. Выглядит довольно просто. Но, тем не менее, существует файл composer.lock, который генерируется в корне вашего проекта. Для чего он? Что с ним делать?

А знаете ли вы где находится ваш lock файл?

Несколько недель назад в своем твитере я сделал заметку о том, что в проекте OpenCFP отсутствует composer.lock файл. Ну и что такого, могли бы вы сказать, достаточно запустить composer install и он там появится. Ведь вы установите те же самые пакеты, не так ли?”. А вот и нет.

Вся суть этого файла в том, что в нём хранятся точные версии установленных пакетов, что требуется для их переустановки. То есть допустим, у вас установлена версия пакета 1.*, ваш коллега выполняет composer update и получает версию 1.2.4, а файл composer.lock отправляет в систему контроля версий. Таким образом вы тоже получите версию 1.2.4, даже если доступна 1.3.0. То есть все участники разработки работают с одними и теми же версиями пакетов.

Хорошо, следующий вопрос, который может у вас возникнуть, по идее все новые версии пакетов должны быть совместимы с более старыми, в чем же загвоздка?

Конечно, если вы проводите полное рецензирование своего кода от зависимости к зависимости, то может вы и избежите проблем, но, скорее всего, шанс, что небольшой баг все таки закрадется, довольно велик. Человеческий фактор никто не отменял.

Довольно часто в composer.json в качестве версии указывается dev-master, таким образом вы получаете самую последнюю версию пакета. Таким образом если что-то новое было добавлено в пакет со времени последнего обновления проекта, вы получите этот код себе если не используете lock файл.

Опять, это может вызвать лишние поломки в коде. Поэтому строить свой проект стоит именно на основе файла composer.lock. В конце концов composer это инструмент помогающий отгородить вас от лишних проблем в коде и с этой точки зрения он и должен быть использован.

Install или Update?

Часто люди задают вопрос, как же правильнее поступать, обновлять или устанавливать проект. Как только вы поставите в центр внимания composer.lock файл, а не список зависимостей, картина станет яснее.

Запуск composer install сделает следующее:

  • Проверит существует ли composer.lock файл
  • Если его нет, то выполнит composer update и создаст его
  • Если файл уже существует, то установит указанные версии пакетов из lock файла

Запуск composer update выполнит:

  • Проверит composer.json
  • Составит список пакетов, которые следует обновить, основываясь на указанные версии пакетов
  • Установит последние обновления
  • Обновит файл composer.lock

В любом случае после каждой из команд следует отправить composer.lock в файл в систему контроля версий, чтобы все ваши коллеги также использовали нужные версии.

Но существует исключение из правил. При использовании, например, Zend Framework 2 Skeleton App, зависимости должны обновляться при установке, так как Skeleton App это мета приложение. Поэтому вам необходимы последние обновления перед началом разработки. Но файл composer.lock не сохраняется в систему контроля версий.

Развертывание проекта

При наличии composer.lock вы должны запускать composer install при развертывании проекта. Таким образом вы получаете одинаковые версии пакетов на рабочем сервере и на машине разработчика. Также composer не требует проверять все зависимости и их версии, что повышает производительность проекта.

Также при использовании composer.lock вы получаете стабильный набор пакетов и их версий при использовании кластеров. Вы можете легко обновлять проект на недели или месяцы позднее, чем обновились версии пакетов, и вам не придется задумываться о возможных конфликтах версий.

Заключение

Как вы сами видите, что файл composer.lock несет на себе довольно большую ответственность. И если у вас возникает вопрос обновлять вам или устанавливать пакеты, то именно этот файл должен помочь вам найти ответ. Если вы правильно свяжете эти команды с тем, что они делают с файлом composer.lock(а не с зависимостями), то вы не ошибётесь.

В общем, если у вас есть сомнения отправлять ли composer.lock в систему контроля версий, то ответ — ДА.