运行时 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 开始,您也可以通过将 false 作为第二个参数传递来检查某个东西是否通过 require-dev 安装。

\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');

如果例如 vendor/package 安装在与 2.0.* 匹配的版本中,这将返回 true,但即使给定的包名称被替换或由其他包提供,也会返回 true。

知道包 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 返回值。


其他一些方法可用于更复杂的用法,请参考 类本身 的源代码/docblocks。

知道包安装的位置#

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)并列出已安装的该类型包。然后,您可以使用上面的方法检索有关每个包的更多信息(如果需要)。

此方法应该可以消除自定义安装程序将插件放置在特定路径中而不是将其留在 vendor 目录中的需求。然后,您可以通过 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 安装的二进制文件时设置。详细了解 vendor 二进制文件文档

这是由二进制代理设置的,因此 Composer 的 vendor/autoload.php 不会将其提供给项目,这将毫无用处,因为它会指向自身。

二进制(bin-dir)路径在二进制文件#

composer-runtime-api 2.2.2 引入了一个新的 $_composer_bin_dir 全局变量,该变量在运行使用 Composer 安装的二进制文件时设置。详细了解 vendor 二进制文件文档

这是由二进制代理设置的,因此 Composer 的 vendor/autoload.php 不会将其提供给项目。

配置 | 社区

发现错别字?本文档中有错误?分叉并编辑 它!