运行时Composer工具
虽然Composer主要用于在项目中安装依赖项,但在运行时也会为你提供一些功能。
如果你需要在特定版本中依赖其中一些内容,可以要求使用composer-runtime-api包。
自动加载器是最常用的,并且已在我们的基本使用指南中涵盖。它在所有Composer版本中都可用。
composer-runtime-api 2.0 引入了一个新的Composer\InstalledVersions类,该类提供了一些静态方法来检查当前安装的版本。只要你包含 Composer 自动加载器,你的代码就可以自动使用这个类。
该类的主要用例如下:
了解包X(或虚拟包)是否存在
Section titled “了解包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安装
Section titled “了解包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。
了解包X的版本
Section titled “了解包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');了解包自身的已安装版本
Section titled “了解包自身的已安装版本”如果你只关心获取某个包自身的版本,例如在acme/foo的源代码中,你想知道acme/foo当前运行的版本以展示给用户,那么使用getVersion/getPrettyVersion/getReference是可行的。
上一节中的警告在此情况下不适用,因为你可以确定该包已存在,并且在你的代码运行时不会被替换。
不过,为了安全起见,确保尽可能妥善地处理null返回值仍然是个好主意。
还有一些其他方法可用于更复杂的用法,请参考该类本身的源代码/文档块。
了解软件包的安装路径
Section titled “了解软件包的安装路径”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)
了解已安装的特定类型的包
Section titled “了解已安装的特定类型的包”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不会将其提供给项目。