Полное руководство по пакетному менеджеру для PHP

Раздел: Инструменты разработки -> Управление зависимостями

Основные операции с Composer

Эффективное решение: использование Composer для управления зависимостями

Composer является стандартным менеджером пакетов для PHP. Основной способ работы включает инициализацию проекта, добавление зависимостей, автоматическую загрузку классов и управление версиями.

Пример базового рабочего процесса:


# Инициализация проекта
composer init --name="my/project" --description="Пример проекта" --type="project" --no-interaction

# Добавление зависимости
composer require monolog/monolog:^2.0

# Установка зависимостей из composer.lock (или composer.json)
composer install

# Автозагрузка классов в коде
require __DIR__ . '/vendor/autoload.php';
$log = new Monolog\Logger('my_logger');
$log->pushHandler(new Monolog\Handler\StreamHandler('app.log', Monolog\Logger::WARNING));
$log->warning('Тестовое сообщение');
  

Docker php composer (composer в docker php)

После выполнения команд создаются файлы composer.json, composer.lock и директория vendor/ с загруженными пакетами. Autoload (PSR-4) подключается одной строкой.

Типичные проблемы и их решения:

  • Ошибка "Composer could not find a composer.json" - решение: убедиться, что команда выполняется в корне проекта, где находится composer.json.
  • Недостаточно памяти (memory exhausted) - решение: увеличить memory_limit в php.ini или выполнить с флагом COMPOSER_MEMORY_LIMIT=-1.
  • Конфликт версий пакетов - решение: уточнить диапазон версий, использовать composer why-not vendor/package version для диагностики.
  • Проблемы с правами доступа к vendor или кэшу - решение: избегать запуска от root, настроить права на директорию или использовать composer config cache-dir.

Как зафиксировать точную версию пакета для стабильности?

Использование оператора ~ или ^ в composer.json позволяет задать допустимые обновления, но для полной фиксации указывается точная версия. Например:

composer require symfony/console:5.4.0

Autoload php composer (автозагрузка классов с помощью composer в php)

После установки в composer.lock окажется версия 5.4.0, но если позже выполнить composer update, она может измениться, если не указана точно. Для постоянной фиксации следует добавить пакет в require без операторов и не запускать update без необходимости.

Проблема: случайное обновление пакета при composer install (если lock файл повреждён).

Решение: всегда использовать composer install (читает lock) вместо composer update в production, а lock-файл хранить в системе контроля версий.

Как отделить зависимости для разработки от боевого окружения?

Использование секции require-dev в composer.json. Пакеты добавляются с флагом --dev:

composer require --dev phpunit/phpunit:^9.5

Php composer package (управление пакетами composer в php)

При установке на production выполняется composer install --no-dev, и dev-зависимости не загружаются.

Проблема: случайное использование dev-пакета в production-коде.

Решение: настроить CI/CD, чтобы проверять наличие запрещённых классов, либо использовать инструменты статического анализа.

Как подключить приватный репозиторий для корпоративных пакетов?

В composer.json добавляется секция repositories с указанием типа (vcs, git, composer) и URL:


{
  "repositories": [
    {
      "type": "vcs",
      "url": "https://git.company.com/team/private-package.git"
    }
  ],
  "require": {
    "company/private-package": "^1.0"
  }
}
  

Composer php 8.1 (установка composer для php 8.1)

Composer клонирует репозиторий и использует его как источник. Для аутентификации применяются SSH-ключи или файл auth.json.

Проблема: ошибка доступа при клонировании (Permission denied).

Решение: настроить SSH-ключи и добавить хост в known_hosts. Альтернатива - использовать токен доступа в URL https://token@git.company.com/... или настроить auth.json.

Как автоматизировать действия при установке зависимостей?

В composer.json определяются скрипты, которые запускаются на события (pre-update-cmd, post-install-cmd и т.д.):


{
  "scripts": {
    "post-install-cmd": [
      "@php -r 'echo \"Установка завершена!\";'",
      "App\\Scripts\\PostInstall::run"
    ],
    "pre-update-cmd": [
      "@composer clear-cache"
    ]
  }
}
  

Php composer json (php: работа с composer.json)

Можно вызывать любые PHP-скрипты или консольные команды.

Проблема: скрипт не выполняется из-за отсутствия класса.

Решение: убедиться, что класс загружается через autoload (PSR-4) или указан полный путь. Также проверить права на выполнение.

Как ускорить автозагрузку классов в production?

Оптимизация autoload с помощью генерации карты классов:

composer dump-autoload -o

Флаг -o (optimize) создаёт отображение класса в файл, что сокращает время поиска. Для максимальной производительности используется composer install --optimize-autoloader или --classmap-authoritative.

Проблема: новые классы не находятся после добавления файлов.

Решение: выполнить composer dump-autoload без флага, чтобы обновить автозагрузчик.

- Composer php (composer менеджер зависимостей php)
- удалить php (удаление php)

Расширенные примеры работы с Composer

Пример 1. Создание собственного пакета и публикация на Packagist

Предполагается, что есть класс в пространстве имён MyCompany\Logger. Структура проекта:

Пример

my-logger/
  src/
    Logger.php
  composer.json
  

Содержимое composer.json:

Пример

{
  "name": "mycompany/my-logger",
  "description": "Простой логгер",
  "type": "library",
  "autoload": {
    "psr-4": {
      "MyCompany\\Logger\\": "src/"
    }
  },
  "require": {
    "php": ">=7.4"
  },
  "extra": {
    "branch-alias": {
      "dev-master": "1.0-dev"
    }
  }
}
  

После публикации на Packagist (или использовании локального репозитория) пакет устанавливается командой:

Пример
composer require mycompany/my-logger:dev-master

Результат: в vendor/mycompany/my-logger появятся файлы, класс MyCompany\Logger\Logger будет доступен через autoload.

# Вывод после установки
Installing mycompany/my-logger (dev-master 123abc)
  - Installing mycompany/my-logger (dev-master 123abc): Loading from cache
  

Пример 2. Использование Satis для создания приватного репозитория

Satis генерирует статичный репозиторий из заданных пакетов. Создаётся файл конфигурации satis.json:

Пример

{
  "name": "My Private Repository",
  "homepage": "http://repo.company.com",
  "repositories": [
    {
      "type": "vcs",
      "url": "git@git.company.com:team/secret-package.git"
    }
  ],
  "require": {
    "company/secret-package": "*"
  },
  "config": {
    "archive": {
      "directory": "dist",
      "format": "tar"
    }
  }
}
  

Генерация репозитория:

Пример
php satis.phar build satis.json /var/www/repo/

В папке /var/www/repo/ появляются packages.json и архив дистрибутивов.

В проектах, использующих этот репозиторий, composer.json должен содержать ссылку:

Пример

{
  "repositories": [
    {
      "type": "composer",
      "url": "http://repo.company.com"
    }
  ]
}
  

Результат: composer require company/secret-package загружает пакет из приватного Satis.

Пример 3. Ручное редактирование composer.json и разрешение конфликтов

Допустим, проект требует symfony/console:^5.0 и symfony/framework-bundle:^5.2. При попытке composer update может возникнуть конфликт, если один из пакетов требует определённую подверсию другого.

Команда для анализа:

Пример
composer why-not symfony/console 5.1

Вывод покажет, какие пакеты блокируют установку версии 5.1.

symfony/framework-bundle 5.2.0 requires symfony/console (^5.2)
  

Решение: изменить требование на symfony/console:^5.2 и выполнить composer update symfony/console symfony/framework-bundle.

Результат: зависимости согласованы, composer.lock обновлён.

Пример 4. Использование composer install в CI/CD с кэшированием

В GitLab CI можно кэшировать директорию vendor и composer.lock для ускорения сборок:

Пример

# .gitlab-ci.yml
cache:
  key: ${CI_COMMIT_REF_SLUG}
  paths:
    - vendor/
    - .composer-cache/

before_script:
  - composer config cache-dir .composer-cache

script:
  - composer install --no-dev --prefer-dist --no-progress
  

Результат: при повторных сборках пакеты берутся из кэша, а не загружаются заново.

Пример 5. Использование скриптов для автоматического форматирования кода

В composer.json добавить скрипт, запускающий PHP-CS-Fixer после обновления:

Пример

{
  "scripts": {
    "post-update-cmd": [
      "vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.php"
    ]
  }
}
  

При выполнении composer update автоматически запускается форматирование кода.

Управление пакетами Composer в PHP - comments

En
Php composer package (php)