- Автозагрузка
- Установленные версии
- Проверка платформы
- Путь автозагрузчика в двоичных файлах
- Путь двоичного файла (bin-dir) в двоичных файлах
Утилиты Composer времени выполнения#
Хотя Composer в основном используется для установки зависимостей в проекте, во время выполнения доступно несколько функций.
Если вам нужно использовать некоторые из них в определённой версии, вы можете запросить пакет `composer-runtime-api`.
Автозагрузка#
Автозагрузчик является наиболее используемым и упоминается в нашем руководстве по основному использованию. Он доступен во всех версиях Composer.
Установленные версии#
composer-runtime-api 2.0 представил новый класс `Composer\InstalledVersions`, который предлагает несколько статических методов для проверки установленных версий. Он автоматически доступен для вашего кода при условии, что вы включили автозагрузчик Composer.
Основными вариантами использования этого класса являются:
Выявление наличия пакета X (или виртуального пакета)#
\Composer\InstalledVersions::isInstalled('vendor/package'); // returns bool
\Composer\InstalledVersions::isInstalled('psr/log-implementation'); // returns bool
Начиная с Composer 2.1, вы также можете проверить, что-то было установлено через require-dev или нет, передав false в качестве второго аргумента
\Composer\InstalledVersions::isInstalled('vendor/package'); // returns true assuming this package is installed
\Composer\InstalledVersions::isInstalled('vendor/package', false); // returns true if vendor/package is in require, false if in 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()。在應用程式碼中,您有更多的控制權且不那麼重要。
// returns a normalized version (e.g. 1.2.3.0) if vendor/package is installed,
// or null if it is provided/replaced,
// or throws OutOfBoundsException if the package is not installed at all
\Composer\InstalledVersions::getVersion('vendor/package');
// returns the original version (e.g. v1.2.3) if vendor/package is installed,
// or null if it is provided/replaced,
// or throws OutOfBoundsException if the package is not installed at all
\Composer\InstalledVersions::getPrettyVersion('vendor/package');
// returns the package dist or source reference (e.g. a git commit hash) if vendor/package is installed,
// or null if it is provided/replaced,
// or throws OutOfBoundsException if the package is not installed at all
\Composer\InstalledVersions::getReference('vendor/package');
知道套件自己的已安裝版本#
如果您只想取得套件自己的版本,例如在 acme/foo 的來源中,您想要知道 acme/foo 目前執行的是哪個版本,以便向使用者顯示該版本,則可以接受使用 getVersion/getPrettyVersion/getReference。
上述章節中的警告在此情況下不適用,因為如果您程式碼正在執行,您便可以確定套件已存在且沒有被取代。
不過,為安全起見,盡量優雅地處理 null
傳回值會是個好主意。
針對更複雜的用途,可以使用一些其他方法,請參閱 該類別本身 的來源/文件區塊。
知道套件已安裝的路徑#
getInstallPath
方法用於擷取套件的絕對安裝路徑。
注意:路徑雖然是絕對的,但可能會包含
../
或符號連結。不保證等於realpath()
,因此如果對您很重要,您應該對其執行 realpath。
// returns an absolute path to the package installation location if vendor/package is installed,
// or null if it is provided/replaced, or the package is a metapackage
// or throws OutOfBoundsException if the package is not installed at all
\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 擴充功能產生令人意外的空白死亡畫面,您可以將 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 安裝的二進位檔時會設定。在 供應商二進位檔文件 上進一步瞭解其詳細資訊。
此項是由二進位檔代理伺服器設定的,因此 Composer 的 vendor/autoload.php
並未提供給專案使用,因為它會指向自身,而且這樣沒什麼用處。
二進位檔中的二進位檔 (bin-dir) 路徑#
composer-runtime-api 2.2.2 引進新的 $_composer_bin_dir
全域變數,當執行使用 Composer 安裝的二進位檔時會設定。在 供應商二進位檔文件 上進一步瞭解其詳細資訊。
此項是由二進位檔代理伺服器設定的,因此 Composer 的 vendor/autoload.php
並未提供給專案使用。
找到了拼字錯誤?本文件中有錯誤之處?分岔並編輯它!