如何检测PHP脚本中是否安装了PEAR包?

asa*_*alo 4 php pear

我正在尝试编写一些代码来跟踪依赖项.有没有办法以编程方式检测是否已安装PEAR包?我想的是:

if ($some_pear_api->isPackageInstalled('FooPack')) {
    echo 'FooPack is installed!';
} else {
    echo 'FooPack is not installed. :(';
}
Run Code Online (Sandbox Code Playgroud)

我知道你可以简单地检测该包的类文件是否存在,但我主要想知道PEAR是否已安装,因为有时一些库提供了包含其代码的其他方法(例如PHPUnit有一个梨通道以及一个git repo ).

谢谢您的帮助!

kgu*_*est 7

您需要使用PEAR_Registry类来执行此操作(这是PEAR脚本本身使用的).从3年前开始阅读Adam Harvey的博客文章" 梨 - >列表 " - 您需要的所有细节/示例都在那里.

include 'PEAR/Registry.php';

$reg = new PEAR_Registry;
foreach ($reg->listPackages() as $package) {
    print "$package\n";
}
Run Code Online (Sandbox Code Playgroud)

如果您需要这个来检查每个包的特定版本,那么您可以基于以下示例,我在该博客条目的注释中提供了以下示例:

<?php                           
require 'PEAR/Registry.php';
$reg = new PEAR_Registry;                 
define("NAME", 0);         
define("VERSION", 1);
$packages = array(
    array("PEAR", "1.6.2"),
    array("Date", "1.4.7"),    
    array("Date_Holidays", "0.17.1"),
    array("Validate_IE", "0.3.1")
);
foreach ($packages as $package) {
    $pkg = $reg->getPackage($package[NAME]);
    $version = $pkg->getVersion();
    echo "{$package[NAME]} – {$package[VERSION]} – ";
    echo version_compare($version, $package[VERSION], '>=') ? 'OK': 'BAD', "\n";
}
?>
Run Code Online (Sandbox Code Playgroud)

如果您需要复制并粘贴它,那么最好使用https://gist.github.com/kenguest/1671361上的版本.