В чем разница между require и require-dev в composer.json?

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

Ответ

Секции require и require-dev в файле composer.json разделяют зависимости по их назначению в жизненном цикле проекта.

require содержит пакеты, необходимые для работы приложения в любом окружении, включая продакшен. Это основные зависимости.

require-dev содержит пакеты, нужные только во время разработки, тестирования или CI/CD. Они не требуются для работы приложения на боевом сервере.

Практический пример composer.json:

{
    "name": "myapp/project",
    "require": {
        "laravel/framework": "^10.0",
        "guzzlehttp/guzzle": "^7.0"
    },
    "require-dev": {
        "phpunit/phpunit": "^10.0",
        "fakerphp/faker": "^1.20",
        "barryvdh/laravel-debugbar": "^3.0"
    }
}

Как это работает при установке:

  • composer install — по умолчанию устанавливает пакеты из обеих секций.
  • composer install --no-dev — устанавливает только пакеты из require. Это стандартная команда для деплоя на продакшен.
  • composer update — обновляет пакеты согласно правилам версионирования в composer.json. Флаг --no-dev также игнорирует dev-зависимости.

Типичное разделение:

  • В require: фреймворки (Laravel, Symfony), библиотеки для работы с БД (Doctrine), HTTP-клиенты, кеширование и т.д.
  • В require-dev: фреймворки для тестирования (PHPUnit, Pest), генераторы тестовых данных (Faker), инструменты для профилирования и отладки (Xdebug, Laravel Debugbar), статические анализаторы (PHPStan, Psalm).

Важно: При развёртывании приложения всегда используйте composer install --no-dev --optimize-autoloader, чтобы избежать установки ненужных в продакшене пакетов и ускорить автозагрузку.