Что такое секция require в файле composer.json?

Ответ

Секция require в файле composer.json — это обязательный раздел, который определяет список пакетов (зависимостей), необходимых для работы вашего PHP-проекта в production-среде.

Синтаксис и пример:

{
    "require": {
        "php": ">=8.1",
        "laravel/framework": "^10.0",
        "guzzlehttp/guzzle": "^7.0",
        "ext-json": "*"
    }
}

Ключевые моменты:

  • Формат: "vendor/package-name": "version-constraint".
  • Установка: После добавления зависимостей в require необходимо выполнить composer install. Composer скачает указанные пакеты и их зависимости, создаст vendor/ директорию и сгенерирует composer.lock.
  • Ограничения версий:
    • ^10.0 — совместимо с версиями >=10.0.0 и <11.0.0 (рекомендуемый формат).
    • ~10.5.0 — совместимо с >=10.5.0 и <10.6.0.
    • "8.*" или "8.x" — любая версия в мажорной ветке 8.
    • "dev-main" — установка из конкретной ветки репозитория.
  • Специальные зависимости:
    • "php" — указывает минимальную требуемую версию PHP.
    • "ext-json" — требует наличие PHP-расширения json.
  • Отличие от require-dev: Зависимости для разработки (тестирование, статический анализ, линтинг) указываются в отдельной секции "require-dev". Они не устанавливаются в production-среде при использовании флага --no-dev.

Практическое использование:

  1. Добавить пакет: composer require vendor/package.
  2. Обновить зависимости после ручного изменения composer.json: composer update.
  3. Установить зависимости из существующего composer.lock: composer install (гарантирует одинаковые версии у всех разработчиков).

Ответ 18+ 🔞

Давай разберём, что это за магия в composer.json, а то некоторые думают, что это просто список для галочки. Секция require — это, по сути, священный договор о том, без чего твой проект — просто куча файлов, которая даже не пискнет.

Как это выглядит и что внутри: Вот смотри, обычная картина:

{
    "require": {
        "php": ">=8.1",
        "laravel/framework": "^10.0",
        "guzzlehttp/guzzle": "^7.0",
        "ext-json": "*"
    }
}

Объясняю на пальцах, без соплей:

  • Формат — железный: "продавец/название-пакета": "ограничение-версии". Запомнил? Иди дальше.
  • Что делать после правок? Бля, ну очевидно же — запускаешь composer install в консоли и ждёшь, пока он накачает всю эту кучу в папку vendor/. Если файл composer.lock уже есть, он возьмёт версии оттуда, чтобы у всех в команде был одинаковый зоопарк. Без этого — бардак, доверия ебать ноль.
  • Версии (тут многие ебутся):
    • ^10.0 — самая адекватная штука. Значит «дай мне версию 10.0.0 или новее, но только не 11.0». То есть, все минорные обновления и багфиксы — пожалуйста, а ломающие изменения — нахуй.
    • ~10.5.0 — это уже потоньше. «Дай мне 10.5.0 или новее, но только не 10.6». Только патчи.
    • "8.*" — «любую версию, лишь бы восьмёрка в начале». Хуй с горы, но иногда нужно.
    • "dev-main" — «хочу самую свежую хуйню прямо из ветки main в гите». Рисково, но для смелых.
  • Особые гости в списке:
    • "php": ">=8.1" — это не пакет, а требование к среде. Проект говорит: «Мне нужен пхп не ниже 8.1, иначе я даже не запущусь, ёпта».
    • "ext-json" — требует одноимённое расширение пхп. Звёздочка * значит — «да похуй на версию, лишь бы было».
  • Чем не require-dev? Всё просто, чувак. В require лежит то, без чего продакшн умрёт. В require-dev — то, что нужно только тебе на локалке: всякие тесты, линтеры, отладчики. На боевом сервере их ставят с флагом --no-dev, чтобы лишнего хлама не тащить.

Что делать на практике, чтобы не быть распиздяем:

  1. Добавить пакет вручную в файл и запустить composer update? Можно, но зачем усложнять? Проще в консоли набрать composer require vendor/package. Он сам и в файл добавит, и скачает, и зависимости его подтянет. Удобно же.
  2. Скачал проект, а там только composer.json? composer install, и всё само подтянется по версиям из composer.lock (если он есть). Нет лока — посмотрит в джсон и создаст новый лок. Главное — не коммить папку vendor/ в git, ядрёна вошь! Она генерится.
  3. Хочешь обновить всё по-максимуму? composer update пройдётся по всем пакетам из require и обновит их до самых свежих версий, которые проходят по твоим ограничениям. После этого он перепишет composer.lock. Делай это с умом, а то обновишься и всё накрывается медным тазом.

Короче, require — это фундамент. Не наебёшься с версиями — будет тебе хиросима в продакшене. Относись с уважением.