Ответ
Разница заключается в том, какой файл (composer.json или composer.lock) является источником истины для определения устанавливаемых версий пакетов.
composer install
- Основная задача: Установить зависимости, точно соответствующие версиям, зафиксированным в
composer.lock. - Как работает:
- Проверяет наличие файла
composer.lock. - Если файл есть, устанавливает все пакеты в версиях, указанных в нем. Это гарантирует, что у всех разработчиков и на всех окружениях (dev, staging, production) будут идентичные версии зависимостей.
- Если файла
composer.lockнет (например, проект только что склонирован), он ведет себя какcomposer update— читаетcomposer.json, устанавливает последние подходящие версии и создает новыйcomposer.lock.
- Проверяет наличие файла
- Когда использовать: Всегда при развертывании проекта на новое окружение (продакшен, CI/CD-пайплайн, новая машина разработчика). Это команда для воспроизведения известного рабочего состояния.
composer update
- Основная задача: Обновить зависимости до последних версий, разрешенных правилами в
composer.json, и записать новые версии вcomposer.lock. - Как работает:
- Игнорирует текущий
composer.lock. - Читает
composer.jsonи для каждого пакета находит самую новую версию, удовлетворяющую указанному ограничению (например,^8.0). - Устанавливает эти новые версии и генерирует обновленный файл
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-файл, обновляя зависимости.