尖刺 / which
一个用于在PATH中查找命令的库。
Requires
- php: ~5.4 || ~7.0
Requires (Dev)
- brianium/habitat: ~1.0
- phpunit/phpunit: ~4.0
- satooshi/php-coveralls: ~0.6.1
- squizlabs/php_codesniffer: ~2.3
Suggests
- brianium/habitat: For better access to environment variables (e.g., for mocking).
This package is auto-updated.
Last update: 2024-09-12 21:33:08 UTC
README
一个用于在PATH中查找命令的PHP库。
要求
此库需要PHP 5.6或更高版本。
安装
此包使用 composer,因此您可以将 nubs/which
添加到您的 composer.json
文件中,或执行以下命令
composer require nubs/which
示例
以下是一个快速示例,演示如何通常使用此库
$locatorFactory = new \Nubs\Which\LocatorFactory\PlatformLocatorFactory(); $locator = $locatorFactory->create(); echo $locator->locate('php'); // /usr/bin/php
用法
构造定位器
有几种方法可以创建定位器。首选方法是使用 brianium/habitat 构造函数。Habitat使得访问环境变量变得容易,即使在 $_ENV
超全局未填充的情况下也是如此。您可以这样使用它
$habitat = new \Habitat\Habitat(); $environment = $habitat->getEnvironment(); $locatorFactory = new \Nubs\Which\LocatorFactory\PlatformLocatorFactory(); $locator = $locatorFactory->create($environment);
Habitat环境不是必需的。如果不传递环境,PHP的内置 getenv
将被使用
$locatorFactory = new \Nubs\Which\LocatorFactory\PlatformLocatorFactory(); $locator = $locatorFactory->create();
此外,还有两个特定于平台的工厂,以防您不想依赖于 PlatformLocatorFactory
中的平台检测。如果您使用的是POSIX系统(例如,Linux、OSX、BSD),则可以使用 PosixLocatorFactory
;如果您使用的是Windows系统,则可以使用 WindowsLocatorFactory
。
$locatorFactory = new \Nubs\Which\LocatorFactory\PosixLocatorFactory(); $locator = $locatorFactory->create(); // or $locatorFactory = new \Nubs\Which\LocatorFactory\WindowsLocatorFactory(); $locator = $locatorFactory->create();
最后,如果您想完全控制要搜索的路径,您可以指定确切的路径
$paths = ['/opt/special/bin', '/usr/local/bin', '/usr/bin', '/bin']; $pathBuilder = new \Nubs\Which\PathBuilder\PosixPathBuilder($paths); $locator = new \Nubs\Which\Locator($pathBuilder); // or $paths = ['C:\\Windows\\System32', 'C:\\Windows']; $pathExtensions = ['.exe', '.com']; $pathBuilder = new \Nubs\Which\PathBuilder\WindowsPathBuilder( $paths, $pathExtensions ); $locator = new \Nubs\Which\Locator($pathBuilder);
查找命令
定位器可以根据其配置的路径查找命令,如果找不到命令,则返回 null
$locatorFactory = new \Nubs\Which\LocatorFactory\PlatformLocatorFactory(); $locator = $locatorFactory->create(); echo $locator->locate('php'); // /usr/bin/php var_dump($locator->locate('asdf')); // NULL
它也可以接受一个绝对或相对路径,在这种情况下,将忽略配置的路径,并基于当前目录进行路径解析
$locatorFactory = new \Nubs\Which\LocatorFactory\PlatformLocatorFactory(); $locator = $locatorFactory->create(); echo $locator->locate('/opt/php/bin/php'); // /opt/php/bin/php chdir('/opt/php'); echo $locator->locate('bin/php'); // /opt/php/bin/php
最后,还包括了一个额外的 locateAll
方法。如果命令在 PATH
的多个位置存在,此方法将返回所有这些位置。它遵循与标准 locate
方法相同的规则。
$locatorFactory = new \Nubs\Which\LocatorFactory\PlatformLocatorFactory(); $locator = $locatorFactory->create(); var_dump($locator->locateAll('php')); // array(2) { // [0] => // string(12) "/usr/bin/php" // [1] => // string(16) "/opt/php/bin/php" // } var_dump($locator->locate('asdf')); // array(0) { // } var_dump($locator->locateAll('/opt/php/bin/php')); // array(1) { // [0] => // string(16) "/opt/php/bin/php" // } chdir('/opt/php'); var_dump($locator->locateAll('bin/php')); // array(1) { // [0] => // string(16) "/opt/php/bin/php" // }
CLI接口
还有一个适用于POSIX系统和Windows的CLI接口,它模仿标准which命令。它作为 nubs/which-cli
提供。
为什么?
我创建which是为了填补我遇到的一个空缺:检测用户是否安装了特定的命令。这主要是为 sensible 库,该库选择用户的首选编辑器/浏览器/分页器,并在未指定偏好时回退到合理的默认值。which为sensible提供了决定不同命令选择是否存在的能力。更多关于它在我的 博客 中。
类似项目
我还知道一个具有类似功能的node.js库: node-which。
许可证
which遵循MIT许可证。有关完整的许可证文本,请参阅 LICENSE。