Утилиты 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 並未提供給專案使用。

配置 | 社群

找到了拼字錯誤?本文件中有錯誤之處?分岔並編輯它!