跳转到内容

运行时Composer工具

虽然Composer主要用于在项目中安装依赖项,但在运行时也会为你提供一些功能。

如果你需要在特定版本中依赖其中一些内容,可以要求使用composer-runtime-api包。

自动加载器是最常用的,并且已在我们的基本使用指南中涵盖。它在所有Composer版本中都可用。

composer-runtime-api 2.0 引入了一个新的Composer\InstalledVersions类,该类提供了一些静态方法来检查当前安装的版本。只要你包含 Composer 自动加载器,你的代码就可以自动使用这个类。

该类的主要用例如下:

\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

请注意,这不能用于检查平台包是否已安装。

**注意:**要使用此功能,你的包必须要求 "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。

**注意:**如果您查询的包名本身未安装,而只是由另一个包提供或替代,那么这将返回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()</b2,因此如果这对您很重要,您应该对其运行 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-* 要求从不被平台检查功能支持或检查。

二进制文件中的自动加载器路径

Section titled “二进制文件中的自动加载器路径”

composer-runtime-api 2.2 引入了一个新的全局变量 $_composer_autoload_path,该变量在运行通过 Composer 安装的二进制文件时设置。在 供应商二进制文件文档 上可以了解更多相关信息。

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

二进制文件中的二进制(bin-dir)路径

Section titled “二进制文件中的二进制(bin-dir)路径”

composer-runtime-api 2.2.2 引入了一个新的全局变量 $_composer_bin_dir,该变量在运行通过 Composer 安装的二进制文件时设置。在 供应商二进制文件文档 上阅读更多相关内容。

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