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

Ответ

Разница заключается в том, какой файл (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-файл, обновляя зависимости.

Ответ 18+ 🔞

А, ну это же классика, ебать мои старые костыли! Сейчас объясню на пальцах, без этой вашей заумщины.

Представь, что composer.json — это твой список покупок в стиле «купи пива, какого-нибудь». А composer.lock — это уже пробитый на кассе чек, где чётко написано «Пиво "Балтика 9", 2 бутылки». Понимаешь разницу?

composer install — это когда ты пришёл домой и просто достаёшь из пакета то, что уже куплено по чеку. Он смотрит в composer.lock и ставит всё точно так же, до последней запятой в версии. Если чека нет — он сначала сходит в магазин, как update, и чек создаст. Эта команда для того, чтобы все в команде и на сервере имели абсолютно одинаковые версии пакетов. Без сюрпризов. На продакшене — только она, и точка.

composer update — это когда ты берёшь свой старый список, идёшь в магазин и говоришь: «Дайте мне самое свежее пиво, какое есть, но только чтоб "Балтика"». Он игнорирует твой старый чек, лезет в репозитории, ищет самые новые версии, которые подходят под условия в composer.json (типа ^8.0), и формирует новый чек. После этого у тебя могут появиться новые версии пакетов, а могут и хуй с горой сломаться, если что-то где-то не совместимо.

Простое правило, которое спасёт тебя от пиздеца:

  1. composer.lock всегда в гите коммитишь. Это святое. Кто не коммитит — тот полупидор.
  2. На своей машине, в процессе разработки, если хочешь обновить зависимости — делаешь composer update. Но желательно не все сразу, а конкретный пакет: composer update symfony/http-kernel. Потом тестишь, что ничего не разъебало, и коммитишь обновлённый composer.lock.
  3. На сервере, в CI/CD, при развёртывании — ВСЕГДА composer install --no-dev. Никаких update! Сервер должен взять чек и воспроизвести точь-в-точь то, что было у тебя на машине. Доверия к окружению — ноль ебать.

Вот и вся магия. install — для стабильности и развёртывания, update — для обновлений в процессе разработки. Запомни это, и волнение ебать по поводу «а почему у меня работает, а на сервере нет» отпадёт само собой.