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

如何检测php脚本中是否安装了PEAR包?,php,pear,Php,Pear,我正在尝试编写一些代码来跟踪依赖关系。有没有办法通过编程检测是否安装了PEAR包?我的想法是: if ($some_pear_api->isPackageInstalled('FooPack')) { echo 'FooPack is installed!'; } else { echo 'FooPack is not installed. :('; } 我知道您可以简单地检测该包的类文件是否存在,但我主要想知道PEAR是否已经安装了该类文件,因为有时一些库提供了包含其代

我正在尝试编写一些代码来跟踪依赖关系。有没有办法通过编程检测是否安装了PEAR包?我的想法是:

if ($some_pear_api->isPackageInstalled('FooPack')) {
    echo 'FooPack is installed!';
} else {
    echo 'FooPack is not installed. :(';
}
我知道您可以简单地检测该包的类文件是否存在,但我主要想知道PEAR是否已经安装了该类文件,因为有时一些库提供了包含其代码的其他方法(例如,PHPUnit有一个PEAR通道和一个git repo)


谢谢你的帮助

您需要使用PEAR_注册表类来实现这一点(这是PEAR脚本本身所使用的)。 阅读亚当·哈维(Adam Harvey)3年前的博客文章“”——你需要的所有细节/例子都在那里

include 'PEAR/Registry.php';

$reg = new PEAR_Registry;
foreach ($reg->listPackages() as $package) {
    print "$package\n";
}
如果您需要检查每个包的特定版本,那么您可以基于以下示例,我在对该博客条目的评论中提供了该示例:

<?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";
}
?>


如果您需要复制并粘贴此内容,则最好使用位于的版本。

您可以使用
Pear/Info
s回答此问题:

<?php
  require_once 'PEAR/Info.php';
  $res = PEAR_Info::packageInstalled('FooPack');
  if ($res) {
     print "Package FooPack is installed \n";
  } else {
     print "Package FooPack is not yet installed \n";
  }
?>

为什么不包括包并查看类是否存在

// Supress Errors. Checking is done below.
@require_once 'PHP/UML.php';

if(!class_exists('PHP_UML'))
{
    throw new Exception('PHP_UML is not installed. Please call `pear install PHP_UML` from the command line',1);
}

// Code to use PHP_UML below...
$uml = new PHP_UML();

我确实尝试过使用PEAR\u注册表,但我有点担心可能无法正确实例化它,因为它需要一些参数:function PEAR\u Registry($PEAR\u install\u dir=PEAR\u install\u dir,$PEAR\u channel=false,$pecl\u channel=false)我没有对此做过任何广泛的研究,但我假设$pear\u install\u dir可以在某些安装中设置,特别是对于定制的pear软件包。我可能错了。但无论如何,这对我来说是最接近的解决方案。谢谢我还应该注意到,我在Mac OS X的MAMP安装中遇到了一些实例化问题。当我在Ubuntu中安装时,它工作得很好。链接正在像苍蝇一样消失。一个摘要会很好,但这需要一个可选的包。