В чем разница между composer.json и composer.lock в PHP?

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

Ответ

composer.json — это декларативный файл конфигурации, где разработчик вручную определяет зависимости проекта и их примерные версии с использованием семантического версионирования (например, "symfony/console": "^5.0").

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

Ключевое отличие:

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

Пример:

// composer.json
{
    "require": {
        "laravel/framework": "^10.0"
    }
}

// composer.lock (сокращённо)
{
    "packages": [
        {
            "name": "laravel/framework",
            "version": "10.45.1",
            "source": {
                "reference": "a1b2c3d4e5"
            }
        }
    ]
}

Практика: Оба файла следует коммитить в систему контроля версий (Git). Это гарантирует, что все члены команды и production-сервер используют идентичные версии зависимостей. При развёртывании на продакшене используется composer install --no-dev, который читает версии из composer.lock.