В чем разница между командами composer install и composer update

«В чем разница между командами composer install и composer update» — вопрос из категории PHP Core, который задают на 28% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Разница заключается в том, какой файл (composer.json или composer.lock) является источником истины для определения устанавливаемых версий пакетов.

composer install

  • Основная задача: Установить зависимости, точно соответствующие версиям, зафиксированным в composer.lock.
  • Как работает:
    1. Проверяет наличие файла composer.lock.
    2. Если файл есть, устанавливает все пакеты в версиях, указанных в нем. Это гарантирует, что у всех разработчиков и на всех окружениях (dev, staging, production) будут идентичные версии зависимостей.
    3. Если файла composer.lock нет (например, проект только что склонирован), он ведет себя как composer update — читает composer.json, устанавливает последние подходящие версии и создает новый composer.lock.
  • Когда использовать: Всегда при развертывании проекта на новое окружение (продакшен, CI/CD-пайплайн, новая машина разработчика). Это команда для воспроизведения известного рабочего состояния.

composer update

  • Основная задача: Обновить зависимости до последних версий, разрешенных правилами в composer.json, и записать новые версии в composer.lock.
  • Как работает:
    1. Игнорирует текущий composer.lock.
    2. Читает composer.json и для каждого пакета находит самую новую версию, удовлетворяющую указанному ограничению (например, ^8.0).
    3. Устанавливает эти новые версии и генерирует обновленный файл composer.lock.
  • Когда использовать: В процессе разработки, когда вы хотите получить обновления пакетов (новые фичи, исправления безопасности).

Практическое правило и примеры

Правило: composer.lock должен коммититься в репозиторий. На продакшене всегда выполняется composer install --no-dev.

Пример рабочего процесса:

# 1. Клонируем проект (composer.lock уже в репозитории)
git clone project.git
cd project

# 2. Воспроизводим точное состояние зависимостей (для разработки)
composer install

# 3. В процессе работы решили обновить пакет symfony/http-kernel до новой minor-версии
# Обновляем только его, чтобы минимизировать риски
composer update symfony/http-kernel

# 4. Проверяем, что все работает, коммитим ИЗМЕНЕННЫЙ composer.lock
git add composer.lock
git commit -m "Update symfony/http-kernel to v6.3.10"

# 5. На сервере (CI/CD) снова выполняется install для развертывания
composer install --no-dev --optimize-autoloader

Ключевое отличие в одном предложении: install восстанавливает состояние из lock-файла, update изменяет lock-файл, обновляя зависимости.