PEAR logo

PEAR_PackageFileManager : The Definitive Guide



Add a new dependency to another package

With package.xml 1.0, channel-based like
With package.xml 2.0, channel-based
With package.xml 2.0, uri-based

PEAR 1.4.0 and package.xml 2.0 supports more package dependencies than package.xml 1.0, but we will see in details what are differences and how we can do (try to do) the same job.

With package.xml 1.0, channel-based like

In table below, consider we have each time $p1 produced by code :

  1. <?php
  2. require_once 'PEAR/PackageFileManager.php';
  3.  
  4. PEAR::setErrorHandling(PEAR_ERROR_DIE);
  5.  
  6. $p1 = new PEAR_PackageFileManager();
  7. ?>

Table 10.3. package.xml 1.0 dependencies

PHP code XML equivalent
           
// 'has' relation
$p1->addDependency('PEAR',
    false, 'has', 'pkg', false);
           
          
           
<deps>
 <dep type="pkg" rel="has"
      optional="no">
      PEAR
 </dep>
</deps>
           
          
           
// 'greater or equal' relation
$p1->addDependency('Archive_Tar',
    '1.0.0', 'ge', 'pkg', false);
           
          
           
<deps>
 <dep type="pkg"
      rel="ge" version="1.0.0"
      optional="no">
      Archive_Tar
 </dep>
</deps>
           
          
           
// 'greater than' relation
$p1->addDependency('MDB2',
    '2.1.0', 'gt', 'pkg', true);
           
          
           
<deps>
 <dep type="pkg"
      rel="gt" version="2.1.0"
      optional="yes">
      MDB2
 </dep>
</deps>
           
          
           
// 'less or equal' relation
$p1->addDependency('Console_Getopt',
    '1.2', 'le', 'pkg');
           
          
           
<deps>
 <dep type="pkg"
      rel="le" version="1.2"
      optional="no">
      Console_Getopt
 </dep>
</deps>
           
          
           
// 'less than' relation
$p1->addDependency('Text_Highlighter',
    '0.7.0', 'lt', 'pkg', true);
           
          
           
<deps>
 <dep type="pkg"
      rel="lt" version="0.7.0"
      optional="yes">
      Text_Highlighter
 </dep>
</deps>
           
          
           
// 'between' relation
$p1->addDependency('PEAR_PackageFileManager',
    '1.6.0a1', 'ge');
$p1->addDependency('PEAR_PackageFileManager',
    '1.6.0b5', 'le');
           
          
           
<deps>
 <dep type="pkg"
      rel="ge" version="1.6.0a1"
      optional="no">
      PEAR_PackageFileManager
 </dep>
 <dep type="pkg"
      rel="le" version="1.6.0b5"
      optional="no">
      PEAR_PackageFileManager
 </dep>
</deps>
           
          
           
// 'conflicting' dependency
$p1->addDependency('DB',
    false, 'not', 'pkg');
           
          
           
<deps>
 <dep type="pkg" rel="not">DB</dep>
</deps>
           
          

With package.xml 2.0, channel-based

In table below, consider we have each time $p2 produced by code :

  1. <?php
  2. require_once 'PEAR/PackageFileManager2.php';
  3.  
  4. PEAR::setErrorHandling(PEAR_ERROR_DIE);
  5.  
  6. $p2 = new PEAR_PackageFileManager2();
  7. ?>

Table 10.4. package.xml 2.0 dependencies

PHP code XML equivalent
           
// 'has' relation
$p2->addPackageDepWithChannel('required',
    'PEAR', 'pear.php.net');
           
          
           
<dependencies>
 <required>
<!-- ... -->
  <package>
   <name>PEAR</name>
   <channel>pear.php.net</channel>
  </package>
 </required>
</dependencies>
           
          
           
// 'greater or equal' relation
$p2->addPackageDepWithChannel('required',
    'Archive_Tar', 'pear.php.net',
    '1.0.0');
           
          
           
<dependencies>
 <required>
<!-- ... -->
  <package>
   <name>Archive_Tar</name>
   <channel>pear.php.net</channel>
   <min>1.0.0</min>
  </package>
 </required>
</dependencies>
           
          
           
// 'greater than' relation
$p2->addPackageDepWithChannel('optional',
    'MDB2', 'pear.php.net',
    '2.1.0', false, false, '2.1.0');
           
          
           
<dependencies>
 <required>
<!-- ... -->
 </required>
 <optional>
  <package>
   <name>MDB2</name>
   <channel>pear.php.net</channel>
   <min>2.1.0</min>
   <exclude>2.1.0</exclude>
  </package>
 </optional>
</dependencies>
           
          
           
// 'less or equal' relation
$p2->addPackageDepWithChannel('required',
    'Console_Getopt', 'pear.php.net',
    false, '1.3.0');
           
          
           
<dependencies>
 <required>
<!-- ... -->
  <package>
   <name>Console_Getopt</name>
   <channel>pear.php.net</channel>
   <max>1.3.0</max>
  </package>
 </required>
</dependencies>
           
          
           
// 'less than' relation
$p2->addPackageDepWithChannel('optional',
    'Text_Highlighter', 'pear.php.net',
    false, '0.7.0', false, '0.7.0');
           
          
           
<dependencies>
 <required>
<!-- ... -->
 </required>
 <optional>
  <package>
   <name>Text_Highlighter</name>
   <channel>pear.php.net</channel>
   <max>0.7.0</min>
   <exclude>0.7.0</exclude>
  </package>
 </optional>
</dependencies>
           
          
           
// 'between' relation
$p2->addPackageDepWithChannel('required',
    'PEAR_PackageFileManager', 'pear.php.net',
    '1.6.0a1', '1.6.0b5');
           
          
           
<dependencies>
 <required>
<!-- ... -->
  <package>
   <name>PEAR_PackageFileManager</name>
   <channel>pear.php.net</channel>
   <min>1.6.0a1</min>
   <max>1.6.0b5</max>
  </package>
 </required>
</dependencies>
           
          
           
// 'conflicting' dependency
$p2->addConflictingPackageDepWithChannel('DB',
    'pear.php.net');
           
          
           
<dependencies>
 <required>
<!-- ... -->
  <package>
   <name>DB</name>
   <channel>pear.php.net</channel>
   <conflicts/>
  </package>
 </required>
</dependencies>
           
          

With package.xml 2.0, uri-based

When you use uri-based package dependencies rather than channel-based package dependencies (see previously), you have to use: addPackageDepWithUri() method instead of addPackageDepWithChannel().

Here is a simple example to produce:

  1. <require>
  2.  <package>
  3.   <name>Foo<name>
  4.   <uri>http://www.example.com/Foo-1.3.0 </uri>
  5.  </package>
  6. </require>

you should write:

  1. $p2->addPackageDepWithUri('required', 'Foo', 'http://www.example.com/Foo-1.3.0');
[Important] Important
Do not append tgz or tar extension, when you give the uri. PEAR installer will try to fetch http://www.example.com/Foo-1.3.0.tgz or http://www.example.com/Foo-1.3.0.tar
[Note] Note
List of package installed through pseudo channel __uri may be displayed, on command line, with :
      pear list -a
      
PEAR_PackageFileManager : The Definitive Guide v 1.6.0 : November 17, 2006