Как работает composer? Для чего нужны composer.json и composer.lock?php-17

Composer — это менеджер зависимостей для PHP, который стал стандартом де-факто для управления пакетами и их версиями в современных PHP-проектах.

Как работает Composer?

  1. Анализ зависимостей:

    • Читает composer.json для определения требуемых пакетов
    • Проверяет репозитории (обычно Packagist) на доступность пакетов
    • Разрешает зависимости между пакетами
  2. Загрузка пакетов:

    • Скачивает пакеты в директорию vendor/
    • Автоматически генерирует автозагрузчик классов
  3. Создание lock-файла:

    • Фиксирует точные версии всех зависимостей в composer.lock

Файл composer.json

Это декларативный файл конфигурации, где вы указываете:

{
    "name": "vendor/project",
    "description": "Мой проект",
    "type": "project",
    "require": {
        "php": "^8.0",
        "laravel/framework": "^9.0",
        "monolog/monolog": "^2.0"
    },
    "require-dev": {
        "phpunit/phpunit": "^9.0"
    },
    "autoload": {
        "psr-4": {
            "App\\": "app/"
        }
    }
}

Ключевые секции:

  • require: Основные зависимости (production)
  • require-dev: Зависимости для разработки
  • autoload: Настройки автозагрузки ваших классов
  • scripts: Собственные скрипты для выполнения

Файл composer.lock

Это генеруемый файл, который:

  • Содержит точные версии всех установленных пакетов
  • Включает хеши для проверки целостности
  • Гарантирует идентичные зависимости на всех окружениях

Пример структуры:

{
    "_readme": ["Этот файл блокирует версии пакетов"],
    "content-hash": "a1b2c3d4...",
    "packages": [
        {
            "name": "monolog/monolog",
            "version": "2.5.0",
            "source": {
                "type": "git",
                "url": "https://github.com/Seldaek/monolog.git",
                "reference": "abfd1d84..."
            }
        }
    ]
}

Жизненный цикл работы с Composer

  1. Инициализация:

    composer init
    
  2. Установка зависимостей:

    composer install
    
    • Читает composer.lock (если есть) или создает новый
  3. Добавление пакета:

    composer require vendor/package
    
    • Обновляет composer.json и composer.lock
  4. Обновление пакетов:

    composer update vendor/package
    
    • Обновляет версии в соответствии с composer.json
    • Генерирует новый composer.lock

Разница между install и update

Команда Действие
install Устанавливает версии из composer.lock (если нет — ведет себя как update)
update Игнорирует lock-файл, обновляет зависимости до последних допустимых версий

Автозагрузка классов

Composer автоматически генерирует:

  • vendor/autoload.php — точка входа для автозагрузки
  • Оптимизированные загрузчики для production:
    composer dump-autoload --optimize
    

Best Practices

  1. Храните composer.lock в VCS (Git) — для воспроизводимости сборки
  2. Не храните vendor/ в VCS — устанавливайте зависимости на сервере
  3. Используйте точные версии в CI/CD:
    composer install --no-dev --prefer-dist --no-interaction --no-progress
    
  4. Разделяйте зависимости на require и require-dev

Резюмируем:

Composer — это мощный инструмент управления зависимостями в PHP-проектах. composer.json определяет требования вашего проекта, а composer.lock фиксирует точные версии зависимостей для гарантии одинакового поведения на всех окружениях. Правильное использование этих файлов — ключ к стабильной работе приложения.