InstalledVersions.php в Cotonti
Его основное назначение заключается в том, чтобы предоставить информацию о версиях и путях установленных пакетов, а также предложить методы для работы с этими данными.
Файл InstalledVersions.php, в системе Cotonti, представляет собой часть механизма, который управляет информацией о текущих установленных версиях зависимостей Composer для проекта. Этот файл активно используется для получения информации о версиях, установленных пакетах и их путях, что позволяет движку и разработчикам получать сведения о текущем состоянии зависимостей в системе. Его основное назначение заключается в том, чтобы предоставить информацию о версиях и путях установленных пакетов, а также предложить методы для работы с этими данными.
Основное назначение и место в системе Cotonti
Файл InstalledVersions.php хранится внутри каталога vendor, который является частью структуры зависимости, установленной Composer. Этот файл является результатом работы Composer, который загружает и управляет зависимостями проекта. Его использование позволяет управлять версиями зависимостей и предотвращает их перепутывание, обеспечивая согласованность версий пакетов.
Он является частью пакета Composer, который управляет установкой и обновлением зависимостей. Это важный элемент в системе, так как информация о версиях пакетов, установленных в проекте, хранится в этом файле и может быть использована для различных целей, например, для проверки совместимости версий пакетов с кодом, для получения данных о текущих версиях или для отладки.
Взаимодействие с другими частями сайта
Файл InstalledVersions.php взаимодействует с различными компонентами сайта, который использует зависимостями Composer. Он может быть подключен и использован другими классами, модулями или функциями, которые нуждаются в информации о текущем состоянии зависимостей. Например:
- При запросе версии пакета через метод
getPrettyVersionили других аналогичных методов из этого файла можно узнать текущую версию установленного пакета. - При работе с автозагрузчиком классов Composer файл может использоваться для получения путей установленных пакетов и разрешения классов.
- В случаях, когда необходимо узнать, какие зависимости установлены и какие версии используются, этот файл будет взаимодействовать с кодом, предоставляя такие данные через методы для получения информации о пакете, версии или пути.
Кроме того, он может быть использован для более сложных операций, когда необходимо синхронизировать данные о версиях и путях пакетов между несколькими проектами или различными экземплярами одного проекта. Файл взаимодействует с другими компонентами фреймворка Cotonti через стандартные механизмы Composer.
Методы, функции и классы
Внутри файла определено несколько методов и функций, которые используются для получения информации о версиях и установленных пакетах. В их числе:
-
getInstalled() — Этот метод собирает и возвращает массив данных о всех установленных пакетах, включая информацию о версиях и путях. Он работает с глобальным состоянием
$installedи проверяет зарегистрированные загрузчики классов для извлечения информации о пакетах, включая их версии и пути. -
getVersion(), getPrettyVersion(), getReference(), getInstallPath() — Эти методы используются для получения информации о версии, пути установки, ссылке и других характеристиках конкретного пакета, используя информацию из массива данных о пакете, хранящегося в
installed.php. -
getRootPackage() — Этот метод предоставляет данные о корневом пакете проекта (например, главный пакет, который запускает Composer).
-
getRawData() и getAllRawData() — Эти методы возвращают "сырые" данные о всех установленных пакетах и их версиях, которые можно использовать для пользовательских реализаций.
-
reload() — Метод, который позволяет вручную обновить данные о версиях, подгружая новые данные из внешнего источника (например, другого проекта или автозагрузчика).
Задачи и условия выполнения
Основные задачи, которые выполняет файл InstalledVersions.php:
- Управление информацией о версиях зависимостей: Этот файл предоставляет способ получить точную информацию о версиях всех пакетов, установленных через Composer, что критично для правильной работы сайта или приложения.
- Проверка версий пакетов: С помощью методов, таких как
getPrettyVersion()илиgetVersion(), можно проверять, какие версии пакетов используются, и сверять их с требованиями проекта. - Предоставление путей установки: С помощью метода
getInstallPath()можно узнать, где находятся файлы пакетов, что может быть полезно для отладки и оптимизации. - Гибкость в использовании разных источников данных: Файл может загружать данные о версиях из разных мест (например, из разных экземпляров Composer), что позволяет интегрировать его с другими проектами или версионировать зависимости.
В файле также реализована система, которая позволяет безопасно работать с пакетами, проверяя их наличие и предотвращая ошибки, связанные с отсутствием данных о версиях или путях установки.
В целом, InstalledVersions.php представляет собой важный элемент для получения информации о зависимостях и версиях в рамках системы Cotonti, позволяя системе и разработчикам эффективно работать с пакетами Composer и управлять версиями на всех этапах разработки и эксплуатации сайта.
расположенный по адресу /lib/vendor/composer/InstalledVersions.php
/* * This file is part of Composer. // Этот файл является частью Composer. * * (c) Nils Adermann <[email protected]> // (с) Нильс Аддерманн <[email protected]> * Jordi Boggiano <[email protected]> // Джорди Боггиано <[email protected]> * * For the full copyright and license information, please view the LICENSE // Для получения полной информации о праве собственности и лицензии, пожалуйста, посмотрите файл LICENSE * file that was distributed with this source code. // который был распределен с этим исходным кодом. */ namespace Composer; // Пространство имен Composer. use Composer\Autoload\ClassLoader; // Использование класса ClassLoader из пространства имен Composer\Autoload. use Composer\Semver\VersionParser; // Использование класса VersionParser из пространства имен Composer\Semver.
/**
* This class is copied in every Composer installed project and available to all // Этот класс копируется в каждый установленный проект Composer и доступен всем
*
* See also https://getcomposer.org/doc/07-runtime.md#installed-versions // См. также https://getcomposer.org/doc/07-runtime.md#installed-versions
*
* To require its presence, you can require `composer-runtime-api ^2.0` // Чтобы требовать его присутствие, вы можете потребовать `composer-runtime-api ^2.0`
*
* @final // Этот класс не должен быть расширен.
*/
class InstalledVersions // Класс для работы с установленными версиями пакетов Composer.
{
/**
* @var mixed[]|null // Тип данных для переменной, может быть массивом или null
* @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}|array{}|null // Описание структуры массива с подробным указанием типов
*/
private static $installed; // Статическая переменная для хранения информации о всех установленных версиях пакетов.
/**
* @var bool|null // Тип данных для переменной, может быть булевым значением или null
*/
private static $canGetVendors; // Статическая переменная для хранения флага, указывающего, можно ли получить информацию о поставщиках.
/**
* @var array[] // Массив массивов для хранения установленных версий по каждому поставщику
* @psalm-var array<string, array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
*/
private static $installedByVendor = array(); // Статическая переменная для хранения информации о версиях пакетов по каждому поставщику.
В этом фрагменте определяются переменные класса InstalledVersions, которые будут хранить данные о версиях установленных пакетов, флаги для проверки доступности этой информации, а также дополнительные метаданные, которые касаются установленных версий по каждому поставщику. Эти данные важны для работы с зависимостями в проектах, использующих Composer
/**
* Returns a list of all package names which are present, either by being installed, replaced or provided // Возвращает список всех имен пакетов, которые присутствуют, будь то установленные, замененные или предоставленные
*
* @return string[] // Возвращаемый тип данных — массив строк
* @psalm-return list<string> // В соответствии с псалом-аннотацией, возвращается список строк
*/
public static function getInstalledPackages() // Статический метод для получения списка всех установленных пакетов
{
$packages = array(); // Инициализация пустого массива для хранения имен пакетов
foreach (self::getInstalled() as $installed) { // Перебор всех установленных версий с использованием метода getInstalled()
$packages[] = array_keys($installed['versions']); // Добавление ключей (имен пакетов) из массива versions в массив $packages
}
if (1 === \count($packages)) { // Проверка, если в массиве $packages только один элемент
return $packages[0]; // Возвращается единственный массив с именами пакетов
}
return array_keys(array_flip(\call_user_func_array('array_merge', $packages))); // Слияние всех массивов имен пакетов и возврат уникальных имен
}
Этот метод собирает и возвращает список всех установленных пакетов в проекте, включая те, которые были заменены или предоставлены другими пакетами. Он использует метод getInstalled() для получения данных о каждом установленном пакете и собирает все имена пакетов в массив, который затем обрабатывается для возврата уникальных значений.
/**
* Returns a list of all package names with a specific type e.g. 'library' // Возвращает список всех имен пакетов с определенным типом, например, 'library'
*
* @param string $type // Параметр $type — тип пакета, по которому будет фильтроваться список
* @return string[] // Возвращаемый тип данных — массив строк
* @psalm-return list<string> // В соответствии с псалом-аннотацией, возвращается список строк
*/
public static function getInstalledPackagesByType($type) // Статический метод для получения списка пакетов по типу
{
$packagesByType = array(); // Инициализация пустого массива для хранения пакетов по типу
foreach (self::getInstalled() as $installed) { // Перебор всех установленных версий с использованием метода getInstalled()
foreach ($installed['versions'] as $name => $package) { // Перебор всех пакетов внутри каждой установленной версии
if (isset($package['type']) && $package['type'] === $type) { // Проверка, если существует тип пакета и он соответствует заданному типу
$packagesByType[] = $name; // Добавление имени пакета в массив, если тип совпадает
}
}
}
return $packagesByType; // Возвращение массива пакетов с указанным типом
}
Этот метод используется для получения списка имен пакетов, которые имеют определенный тип, например, "library". Он перебирает все установленные пакеты и проверяет их тип, добавляя в список только те пакеты, которые соответствуют указанному типу.
/**
* Checks whether the given package is installed // Проверяет, установлен ли указанный пакет
*
* This also returns true if the package name is provided or replaced by another package // Также возвращает true, если имя пакета предоставлено или заменено другим пакетом
*
* @param string $packageName // Параметр $packageName — имя проверяемого пакета
* @param bool $includeDevRequirements // Параметр $includeDevRequirements определяет, нужно ли включать зависимые пакеты для разработки
* @return bool // Возвращает булево значение — true, если пакет установлен, иначе false
*/
public static function isInstalled($packageName, $includeDevRequirements = true) // Статический метод для проверки, установлен ли пакет
{
foreach (self::getInstalled() as $installed) { // Перебор всех установленных пакетов
if (isset($installed['versions'][$packageName])) { // Проверка, существует ли пакет с данным именем среди установленных
return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === false; // Возвращаем true, если пакет найден и либо включены требования для разработки, либо пакет не является зависимостью для разработки
}
}
return false; // Если пакет не найден, возвращаем false
}
Этот метод проверяет, установлен ли пакет с заданным именем. Если пакет найден среди установленных, он также учитывает, является ли пакет зависимостью для разработки, в зависимости от параметра $includeDevRequirements. Если параметр равен true или пакет не является зависимостью для разработки, метод возвращает true.
/**
* Checks whether the given package satisfies a version constraint // Проверяет, удовлетворяет ли указанный пакет ограничению версии
*
* e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call: // Например, если вы хотите узнать, установлена ли версия 2.3+ пакета foo/bar, вызовите:
*
* Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3') // Пример использования функции для проверки ограничений версии
*
* @param VersionParser $parser Install composer/semver to have access to this class and functionality // Параметр $parser — объект класса VersionParser, который анализирует версии (требует composer/semver для работы)
* @param string $packageName // Параметр $packageName — имя проверяемого пакета
* @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package // Параметр $constraint — ограничение версии, которое нужно проверить, если оно передано, нужно убедиться, что composer/semver указан в зависимостях пакета
* @return bool // Возвращает булево значение — true, если пакет соответствует ограничению версии, иначе false
*/
public static function satisfies(VersionParser $parser, $packageName, $constraint) // Статический метод для проверки соответствия пакета ограничению версии
{
$constraint = $parser->parseConstraints((string) $constraint); // Преобразуем строковое ограничение версии в объект, используя VersionParser
$provided = $parser->parseConstraints(self::getVersionRanges($packageName)); // Получаем диапазоны версий для данного пакета
return $provided->matches($constraint); // Проверяем, соответствует ли предоставленный диапазон версий ограничению
}
Этот метод проверяет, соответствует ли версия установленного пакета заданному ограничению версии. Для этого используется парсер версий VersionParser, который анализирует строку ограничения и сравнивает её с доступными версиями пакета. Если версия пакета соответствует ограничению, метод возвращает true, иначе — false.
/**
* Returns a version constraint representing all the range(s) which are installed for a given package // Возвращает ограничение версии, представляющее все диапазоны версий, установленные для указанного пакета
*
* It is easier to use this via isInstalled() with the $constraint argument if you need to check // Легче использовать это через isInstalled() с аргументом $constraint, если нужно проверить
* whether a given version of a package is installed, and not just whether it exists // существует ли конкретная версия пакета, а не просто сам факт его наличия
*
* @param string $packageName // Параметр $packageName — имя пакета, для которого нужно получить диапазоны версий
* @return string Version constraint usable with composer/semver // Возвращает строку ограничений версии, которую можно использовать с composer/semver
*/
public static function getVersionRanges($packageName) // Статический метод для получения диапазона версий для указанного пакета
{
foreach (self::getInstalled() as $installed) { // Проходим по всем установленным пакетам
if (!isset($installed['versions'][$packageName])) { // Если в текущем пакете нет указанного пакета
continue; // Переходим к следующему пакету
}
$ranges = array(); // Массив для хранения диапазонов версий
if (isset($installed['versions'][$packageName]['pretty_version'])) { // Если существует "pretty_version" (читаемая версия)
$ranges[] = $installed['versions'][$packageName]['pretty_version']; // Добавляем её в массив диапазонов
}
if (array_key_exists('aliases', $installed['versions'][$packageName])) { // Если существуют псевдонимы для пакета
$ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); // Добавляем псевдонимы в массив диапазонов
}
if (array_key_exists('replaced', $installed['versions'][$packageName])) { // Если пакет был заменён другим
$ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); // Добавляем заменённые версии в массив диапазонов
}
if (array_key_exists('provided', $installed['versions'][$packageName])) { // Если пакет предоставляет другие пакеты
$ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); // Добавляем предоставляемые пакеты в массив диапазонов
}
return implode(' || ', $ranges); // Возвращаем строку всех диапазонов версий, соединённых оператором "или"
}
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); // Если пакет не найден, выбрасываем исключение
}
Этот метод возвращает строку ограничений версии для указанного пакета, включающую все версии, псевдонимы, заменённые или предоставленные версии. Диапазоны версий возвращаются в формате, совместимом с Composer и Semver. Если пакет не установлен, выбрасывается исключение.
/**
* @param string $packageName // Параметр $packageName — имя пакета, для которого нужно получить версию
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present // Если пакет заменён или предоставлен, но не установлен, будет возвращено null. Используйте satisfies или getVersionRanges, если нужно узнать, установлена ли конкретная версия
*/
public static function getVersion($packageName) // Статический метод для получения версии пакета
{
foreach (self::getInstalled() as $installed) { // Проходим по всем установленным пакетам
if (!isset($installed['versions'][$packageName])) { // Если в текущем пакете нет указанного пакета
continue; // Переходим к следующему пакету
}
if (!isset($installed['versions'][$packageName]['version'])) { // Если в пакете нет конкретной версии
return null; // Возвращаем null
}
return $installed['versions'][$packageName]['version']; // Возвращаем версию пакета
}
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); // Если пакет не найден, выбрасываем исключение
}
Этот метод возвращает версию указанного пакета. Если пакет не установлен или если его версия не указана, он возвращает null. В случае, если пакет не найден среди установленных, выбрасывается исключение.
/**
* @param string $packageName // Параметр $packageName — имя пакета, для которого нужно получить "красивую" версию
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present // Если пакет заменён или предоставлен, но не установлен, будет возвращено null. Используйте satisfies или getVersionRanges, если нужно узнать, установлена ли конкретная версия
*/
public static function getPrettyVersion($packageName) // Статический метод для получения "красивой" версии пакета
{
foreach (self::getInstalled() as $installed) { // Проходим по всем установленным пакетам
if (!isset($installed['versions'][$packageName])) { // Если в текущем пакете нет указанного пакета
continue; // Переходим к следующему пакету
}
if (!isset($installed['versions'][$packageName]['pretty_version'])) { // Если в пакете нет "красивой" версии
return null; // Возвращаем null
}
return $installed['versions'][$packageName]['pretty_version']; // Возвращаем "красивую" версию пакета
}
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); // Если пакет не найден, выбрасываем исключение
}
Этот метод возвращает "красивую" версию указанного пакета. Если такой версии нет или пакет не установлен, метод возвращает null. В случае отсутствия пакета выбрасывается исключение.
/**
* @param string $packageName // Параметр $packageName — имя пакета, для которого нужно получить ссылку
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference // Если пакет заменён или предоставлен, но не установлен, будет возвращено null. Используйте satisfies или getVersionRanges, если нужно узнать, установлена ли конкретная версия
*/
public static function getReference($packageName) // Статический метод для получения ссылки на пакет
{
foreach (self::getInstalled() as $installed) { // Проходим по всем установленным пакетам
if (!isset($installed['versions'][$packageName])) { // Если в текущем пакете нет указанного пакета
continue; // Переходим к следующему пакету
}
if (!isset($installed['versions'][$packageName]['reference'])) { // Если в пакете нет ссылки (reference)
return null; // Возвращаем null
}
return $installed['versions'][$packageName]['reference']; // Возвращаем ссылку на пакет
}
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); // Если пакет не найден, выбрасываем исключение
}
Этот метод возвращает ссылку (reference) для указанного пакета. Если ссылка не найдена или пакет не установлен, метод вернёт null. В случае отсутствия пакета выбрасывается исключение.
/**
* @param string $packageName // Параметр $packageName — имя пакета, для которого нужно получить путь установки
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path. // Если пакет заменён или предоставлен, но не установлен, будет возвращён null как путь установки. Пакеты типа метапакетов также имеют null как путь установки.
*/
public static function getInstallPath($packageName) // Статический метод для получения пути установки пакета
{
foreach (self::getInstalled() as $installed) { // Проходим по всем установленным пакетам
if (!isset($installed['versions'][$packageName])) { // Если в текущем пакете нет указанного пакета
continue; // Переходим к следующему пакету
}
return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null; // Возвращаем путь установки, если он есть, иначе возвращаем null
}
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); // Если пакет не найден, выбрасываем исключение
}
Этот метод возвращает путь установки для указанного пакета. Если пакет не установлен или является метапакетом (который не имеет пути установки), метод вернёт null. Если путь установки не найден, будет выброшено исключение.
/**
* @return array // Метод возвращает массив с информацией о корневом пакете
* @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool} // Аннотация psalm для типов возвращаемого массива с информацией о корневом пакете
*/
public static function getRootPackage() // Статический метод для получения информации о корневом пакете
{
$installed = self::getInstalled(); // Получаем все установленные пакеты
return $installed[0]['root']; // Возвращаем информацию о корневом пакете из первого элемента массива
}
Этот метод возвращает информацию о корневом пакете, который был установлен в проекте. В частности, он извлекает и возвращает данные, такие как имя, версия, тип и путь установки корневого пакета.
/**
* Returns the raw installed.php data for custom implementations // Метод возвращает сырые данные из файла installed.php для пользовательских реализаций
*
* @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect. // Пометка, что метод устарел и следует использовать getAllRawData(), который возвращает все данные для всех автозагрузчиков в процессе
* @return array[] // Метод возвращает массив данных
* @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} // Аннотация psalm для возвращаемого типа данных
*/
public static function getRawData() // Статический метод для получения сырых данных из файла installed.php
{
@trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED); // Триггерится предупреждение об устаревшей функции
if (null === self::$installed) { // Если данные о установленных пакетах еще не загружены
// only require the installed.php file if this file is loaded from its dumped location, // Требуется файл installed.php, только если он загружен из его скомпилированного местоположения
// and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 // И не из исходного местоположения пакета composer/composer, см. ссылку на проблему
if (substr(__DIR__, -8, 1) !== 'C') { // Если путь к файлу не заканчивается на 'C' (то есть файл не находится в исходной папке)
self::$installed = include __DIR__ . '/installed.php'; // Загружаем файл installed.php
} else {
self::$installed = array(); // Если файл находится в исходной директории, устанавливаем пустой массив
}
}
return self::$installed; // Возвращаем данные о установленных пакетах
}
Этот метод загружает сырые данные из файла installed.php, если они еще не были загружены. Он используется для получения информации о установленных пакетах, но устарел в пользу метода getAllRawData(), который возвращает все данные для всех автозагрузчиков, а не только для первого загруженного набора.
/**
* Returns the raw data of all installed.php which are currently loaded for custom implementations // Метод возвращает сырые данные всех загруженных файлов installed.php для пользовательских реализаций
*
* @return array[] // Метод возвращает массив данных
* @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}> // Аннотация psalm для возвращаемого типа данных
*/
public static function getAllRawData() // Статический метод для получения всех сырых данных установленных пакетов
{
return self::getInstalled(); // Возвращает данные о всех установленных пакетах
}
Этот метод возвращает все сырые данные из всех загруженных файлов installed.php. Он использует метод getInstalled(), который возвращает данные о пакетах, загруженных в текущем процессе
/**
* Lets you reload the static array from another file // Позволяет перезагрузить статический массив из другого файла
*
* This is only useful for complex integrations in which a project needs to use // Это полезно только для сложных интеграций, когда проект должен использовать
* this class but then also needs to execute another project's autoloader in process, // этот класс, но также необходимо выполнить автозагрузчик другого проекта в процессе,
* and wants to ensure both projects have access to their version of installed.php. // и нужно убедиться, что оба проекта имеют доступ к своей версии файла installed.php.
*
* A typical case would be PHPUnit, where it would need to make sure it reads all // Типичный случай — это PHPUnit, которому нужно убедиться, что он читает все
* the data it needs from this class, then call reload() with // необходимые данные из этого класса, а затем вызвать reload() с
* `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure // `require $CWD/vendor/composer/installed.php` (или аналогичный) в качестве входных данных, чтобы убедиться,
* the project in which it runs can then also use this class safely, without // что проект, в котором он работает, может безопасно использовать этот класс, без
* interference between PHPUnit's dependencies and the project's dependencies. // вмешательства между зависимостями PHPUnit и зависимостями проекта.
*
* @param array[] $data A vendor/composer/installed.php data set // Параметр $data - набор данных из файла vendor/composer/installed.php
* @return void // Возвращаемое значение - ничего не возвращает
*
* @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $data // Аннотация psalm для параметра $data
*/
public static function reload($data) // Статический метод для перезагрузки данных
{
self::$installed = $data; // Перезагружает статическое свойство $installed данными из аргумента $data
self::$installedByVendor = array(); // Очищает кэшированные данные по каждому вендору
}
Этот метод позволяет перезагрузить статическое свойство $installed класса InstalledVersions с новыми данными, переданными через параметр $data. Это полезно в сложных интеграциях, например, когда нужно совместно использовать несколько проектов с их зависимостями
/**
* @return array[] // Возвращает массив массивов
* @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}> // Аннотация psalm: возвращает список массивов с описанием структуры
*/
private static function getInstalled() // Статический метод для получения данных о всех установленных пакетах
{
if (null === self::$canGetVendors) { // Проверяем, можем ли получить список зарегистрированных загрузчиков
self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
}
$installed = array(); // Массив для хранения установленных пакетов
if (self::$canGetVendors) { // Если можем получить зарегистрированные загрузчики
foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { // Проходим по всем зарегистрированным загрузчикам
if (isset(self::$installedByVendor[$vendorDir])) { // Если для данного каталога уже есть установленные данные
$installed[] = self::$installedByVendor[$vendorDir];
} elseif (is_file($vendorDir.'/composer/installed.php')) { // Если файл installed.php существует
/** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */
$required = require $vendorDir.'/composer/installed.php'; // Подключаем и загружаем данные из installed.php
$installed[] = self::$installedByVendor[$vendorDir] = $required; // Добавляем данные в массив установленных пакетов
if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) { // Если $installed еще не инициализирован
self::$installed = $installed[count($installed) - 1]; // Устанавливаем установленные данные для текущего проекта
}
}
}
}
if (null === self::$installed) { // Если переменная $installed пуста
// Только загружаем installed.php, если файл был загружен не из исходного местоположения, а из скомпилированного
if (substr(__DIR__, -8, 1) !== 'C') {
/** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */
$required = require __DIR__ . '/installed.php'; // Подключаем installed.php из текущего каталога
self::$installed = $required; // Инициализируем данные для текущего проекта
} else {
self::$installed = array(); // Если файл не найден, устанавливаем пустой массив
}
}
if (self::$installed !== array()) { // Если $installed не пуст
$installed[] = self::$installed; // Добавляем данные текущего проекта в общий массив
}
return $installed; // Возвращаем массив установленных пакетов
}
Этот метод аккумулирует данные о пакетах и возвращает их в виде массива.
Комментарии (0)
Автор контента
Онлайн
Sodium Carbonate
Последняя авторизация: 19.07.2026 00:44
- Страница размещена: 30.01.2025 17:39
- Последнее обновление: 30.01.2025 22:10