尖刺/which

一个用于在PATH中查找命令的库。

v1.0.1 2015-04-25 18:02 UTC

This package is auto-updated.

Last update: 2024-09-12 21:33:08 UTC


README

一个用于在PATH中查找命令的PHP库。

Build Status Scrutinizer Code Quality Code Coverage

Latest Stable Version Total Downloads License

Dependency Status

要求

此库需要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