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