Использование утилит Composer во время выполнения
Утилиты Composer во время выполнения
  1. Утилиты Composer во время его выполнения
  2. Автозагрузка
  3. Установленные версии
    1. Узнать, присутствует ли пакет X (или виртуальный пакет)
    2. Узнать, установлен ли пакет X в версии Y
    3. Узнать версию пакета X
    4. Узнать установленную версию данного пакета
    5. Узнать путь, по которому установлен пакет
    6. Узнать, какие пакеты определенного типа установлены
  4. Проверка платформы
  5. Путь автозагрузчика к бинарникам
  6. Путь к двоичным файлам (bin-dir) в двоичном пакете


Утилиты Composer во время его выполнения.

Хотя Composer в основном используется при работе с проектом для установки его зависимостей, есть несколько вещей, которые становятся доступны во время его выполнения.

Если необходимо использовать некоторые из них в конкретной версии, можно использовать пакет composer-runtime-api.

Автозагрузка.

Автозагрузчик — самый используемый, и он уже рассматривался в этом руководстве по основам использования Composer. Он доступен во всех версиях Composer.

Установленные версии.

В composer-runtime-api 2.0 появился новый класс Composer\InstalledVersions, который предлагает несколько статических методов для проверки того, какие версии установлены в данный момент. Это автоматически доступно для вашего кода, если вы включили автозагрузчик Composer.

Основные случаи использования этого класса следующие:

Узнать, присутствует ли пакет X (или виртуальный пакет).

\Composer\InstalledVersions::isInstalled('vendor/package'); // возвращает значение bool
\Composer\InstalledVersions::isInstalled('psr/log-implementation'); // возвращает значение bool

Начиная с версии Composer 2.1, вы также можете проверить, было ли что-то установлено через require-dev или нет, передав false в качестве второго аргумента:

\Composer\InstalledVersions::isInstalled('vendor/package'); // возвращает true, если данный пакет установлен
\Composer\InstalledVersions::isInstalled('vendor/package', false); // возвращает true, если vendor/package находится в require, false - если в require-dev

Обратите внимание, что это не может быть использовано для проверки того, установлены ли пакеты платформы.

Узнать, установлен ли пакет X в версии Y.

Примечание: Чтобы использовать это, ваш пакет должен включать "composer/semver": "^3.0".

use Composer\Semver\VersionParser;

\Composer\InstalledVersions::satisfies(new VersionParser, 'vendor/package', '2.0.*');
\Composer\InstalledVersions::satisfies(new VersionParser, 'psr/log-implementation', '^1.0');

Это вернет true, если, например, vendor/package установлен в версии, соответствующей 2.0.*, а также если данное имя пакета заменено или предоставлено каким-либо другим пакетом.

Узнать версию пакета X.

Примечание: Эта функция вернет null, если запрашиваемое имя пакета не установлено, а просто содержится или заменено другим пакетом. Поэтому мы рекомендуем использовать satisfies(), по крайней мере, в библиотечном коде. В коде приложений у вас немного больше контроля, и это менее важно.

// возвращает нормализованную версию (например, 1.2.3.0), если vendor/package установлен,
// или null, если он provided/заменен,
// или выдает OutOfBoundsException, если пакет не установлен вообще
\Composer\InstalledVersions::getVersion('vendor/package');
// возвращает исходную версию (например, v1.2.3), если vendor/package установлен,
// или null, если он provided/заменен,
// или выдает OutOfBoundsException, если пакет вообще не установлен
\Composer\InstalledVersions::getPrettyVersion('vendor/package');
// возвращает значение dist или ссылку на источник пакета (например, хэш коммита git), если vendor/package установлен,
// или null, если он provided/заменен,
// или выдает OutOfBoundsException, если пакет не установлен вообще
\Composer\InstalledVersions::getReference('vendor/package');

Узнать установленную версию данного пакета.

Если вас интересует только получение версии самого пакета, например, в исходном тексте acme/foo вы хотите узнать, какая версия acme/foo работает в данный момент, чтобы показать ее пользователю, то допустимо использовать getVersion/getPrettyVersion/getReference.

Предупреждение в разделе выше в этом случае не применимо, поскольку вы уверены, что пакет присутствует и не заменяется, если ваш код работает.

Тем не менее, для безопасности стоит убедиться, что вы обрабатываете возвращаемое значение null настолько изящно, насколько это возможно.


Для более сложного использования доступны несколько других методов, пожалуйста, обратитесь к исходным текстам/документам самого класса.

Узнать путь, по которому установлен пакет.

Метод getInstallPath для получения абсолютного пути установки пакета.

Примечание: Путь, хотя и абсолютный, может содержать ../ или симлинки. Не гарантируется, что он будет эквивалентен realpath(), поэтому вам следует выполнить realpath, если для вас это важно.

// возвращает абсолютный путь к месту установки пакета, если vendor/package установлен,
// или null, если он указан/заменен, или пакет является метапакетом,
// или возвращает OutOfBoundsException, если пакет не установлен вообще
\Composer\InstalledVersions::getInstallPath('vendor/package');

Доступно начиная с версии Composer 2.1 (т.е. composer-runtime-api ^2.1)

Узнать, какие пакеты определенного типа установлены.

Метод getInstalledPackagesByType получает тип пакета (например, foo-plugin) и перечисляет установленные пакеты этого типа. При необходимости вы можете использовать методы, описанные выше, для получения дополнительной информации о каждом пакете.

Этот метод должен устранить необходимость специальных программ установки помещать плагины по определенному пути вместо того, чтобы оставлять их в каталоге поставщика. Затем вы можете найти плагины для инициализации во время выполнения через InstalledVersions, включая их пути через getInstallPath, если это необходимо.

\Composer\InstalledVersions::getInstalledPackagesByType('foo-plugin');

Доступно начиная с версии Composer 2.1 (т.е. composer-runtime-api ^2.1)

Проверка платформы.

В composer-runtime-api 2.0 появился новый файл vendor/composer/platform_check.php, который включается автоматически при включении автозагрузчика Composer.

Он проверяет, что требования платформы (т.е. php и php-расширения) выполняются запущенным в данный момент PHP-процессом. Если требования не выполнены, скрипт выводит предупреждение с указанием отсутствующих требований и завершает работу с кодом 104.

Чтобы избежать неожиданной белой страницы смерти с предупреждением о каком-то непонятном расширении PHP в production, вы можете запустить composer check-platform-reqs как часть вашей установки/сборки, и если он вернет код, отличный от 0, вы должны прервать процесс.

По умолчанию используется значение php-only, которое проверяет только версию PHP.

Если вы по какой-то причине не хотите использовать эту проверку безопасности и предпочитаете рисковать ошибками во время выполнения кода, вы можете отключить ее, установив опцию platform-check в настройках на false.

Если вы хотите, чтобы проверка включала в себя проверку наличия расширений PHP, установите опцию настройки в true. Требования ext-* будут проверены, но по соображениям производительности Composer будет проверять только наличие расширения, а не его точную версию.

Требования lib-* никогда не поддерживаются и не проверяются функцией проверки платформы.

Путь автозагрузчика к бинарникам.

В composer-runtime-api 2.2 появилась новая глобальная переменная $_composer_autoload_path, устанавливаемая при запуске двоичных файлов, установленных с помощью Composer. Подробнее об этом можно прочитать в документации по двоичным файлам поставщика.

Она устанавливается бинарным прокси и поэтому не доступна для проектов в файле vendor/autoload.php от Composer, который был бы бесполезен, так как указывал бы обратно на себя.

Путь к двоичным файлам (bin-dir) в двоичном пакете.

В composer-runtime-api 2.2.2 появилась новая глобальная переменная $_composer_bin_dir, устанавливаемая при работе с двоичными файлами, установленными с помощью Composer. Подробнее об этом можно прочитать в документации по вендорным двоичным файлам.

Эта переменная устанавливается бинарным прокси и как таковая не доступна проектам из vendor/autoload.php Composer.

Перевод с английского официальной документации Composer:
https://getcomposer.org/doc/07-runtime.md

Заберите ссылку на статью к себе, чтобы потом легко её найти!
Раз уж досюда дочитали, то может может есть желание рассказать об этом месте своим друзьям, знакомым и просто мимо проходящим?
Не надо себя сдерживать! ;)

Старт! Горячий старт на просторы интернета
Старт! Горячий старт на просторы интернета
Старт! Меню