← Назад к вопросам

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

1.0 Junior🔥 272 комментариев
#Composer и PSR

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Различие между composer.json и composer.lock

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


composer.json — Файл объявления зависимостей

composer.json — это файл конфигурации, создаваемый разработчиком, в котором указываются требования к проекту. Он определяет:

  • Какие пакеты и библиотеки необходимы для работы проекта.
  • Допустимые версии этих пакетов (с использованием семантического версионирования).
  • Дополнительные настройки, такие как автозагрузка, скрипты для событий Composer, репозитории и метаданные проекта.

В composer.json вы можете указать зависимости в секциях require (для production) и require-dev (для разработки). Пример:

{
    "name": "мой/проект",
    "require": {
        "monolog/monolog": "^2.0"
    },
    "require-dev": {
        "phpunit/phpunit": "^9.0"
    }
}

Здесь ^2.0 означает "версия 2.0 или выше, но ниже 3.0". Это позволяет гибкость при установке, но может привести к разным версиям в разных средах, если не используется composer.lock.

Ключевые аспекты composer.json:

  • Ручное редактирование: Разработчик создаёт и изменяет этот файл.
  • Гибкость версий: Поддерживает диапазоны версий (например, ~1.2, ^3.4).
  • Конфигурация проекта: Включает настройки автозагрузки, скриптов и репозиториев.
  • Отправляется в VCS: Обычно коммитится в систему контроля версий (Git), чтобы другие разработчики знали требования проекта.

composer.lock — Файл фиксации зависимостей

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

Пример структуры composer.lock:

{
    "packages": [
        {
            "name": "monolog/monolog",
            "version": "2.9.3",
            "source": {
                "type": "git",
                "url": "https://github.com/Seldaek/monolog.git",
                "reference": "a1d72e5c6e9a0ddf6a2f8a6a3d5d0d3c0b4e8f7a"
            }
        }
    ]
}

В этом примере зафиксирована точная версия 2.9.3 и конкретный коммит Git. При установке зависимостей Composer сначала проверяет наличие composer.lock. Если он существует, Composer устанавливает версии из него, игнорируя диапазоны из composer.json. Это гарантирует консистентность.

Ключевые аспекты composer.lock:

  • Автоматическая генерация: Создаётся/обновляется Composer при установке или обновлении зависимостей.
  • Точные версии: Фиксирует конкретные версии и хэши коммитов.
  • Воспроизводимость: Обеспечивает одинаковые зависимости во всех окружениях (разработка, тестирование, production).
  • Следует коммитить в VCS: Рекомендуется добавлять composer.lock в Git, чтобы все участники проекта могли воспроизвести одинаковую установку. Для библиотек это менее критично, но для приложений — обязательно.

Практическое взаимодействие

  1. Первая установка: При запуске composer install без composer.lock, Composer читает composer.json, разрешает зависимости и создаёт composer.lock с конкретными версиями.
  2. Установка с composer.lock: Если composer.lock существует, composer install устанавливает версии из него, игнорируя composer.json. Это безопасно для production.
  3. Обновление зависимостей: Команда composer update читает composer.json, обновляет зависимости до последних разрешённых версий и обновляет composer.lock. Используется для обновления пакетов в разработке.
  4. Разница в работе:
    • Изменение composer.json (например, добавление нового пакета) требует composer update или composer require для применения изменений.
    • Если изменить composer.lock вручную, Composer может проигнорировать это, так как файл считается автоматически управляемым.

Пример workflow:

  • Разработчик добавляет зависимость в composer.json: composer require guzzlehttp/guzzle.
  • Composer обновляет composer.json и создаёт/обновляет composer.lock.
  • composer.lock коммитится в Git.
  • Другой разработчик выполняет git pull, затем composer install — устанавливаются те же версии, что и у первого разработчика.

Вывод

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

Использование обоих файлов — лучшая практика: composer.json для объявления зависимостей, а composer.lock для их фиксации. Это минимизирует ошибки "у меня работает, а у тебя нет" и упрощает развёртывание. Для приложений всегда коммитите composer.lock, для библиотек — по ситуации, но обычно нет.

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