A Single Pear

I’ve just invested several hours trying to get my system to use the Pear libraries from MacPorts rather than the Pear libraries I had installed years ago using the command line installer, as described here. This is largely because I’m happy to let the MacPorts package manager take care of upgrading my software, and making sure all inter-dependencies are looked after.

The command line installer adds files to the traditional /usr/local directory, while the MacPorts package manager adds the files to /opt/local.

And from there, troubles arose.

The truth is, I’d forgotten about the /usr/local pear install, until I’d noticed something peculiar trying to setup a Symfony project I’m working on. Attempting to run one of its command line tasks, I got a fatal error from PHP, reading:

[#!shell]
$ ./symfony cc

Warning: require_once(/opt/local/lib/php/symfony/autoload/sfCoreAutoload.class.php): failed to open stream: No such file or directory in /Users/yanni/Sites/Hosts/breadbreaker.dev/config/ProjectConfiguration.class.php on line 3

Fatal error: require_once(): Failed opening required '/opt/local/lib/php/symfony/autoload/sfCoreAutoload.class.php' (include_path='.:/opt/local/lib/php') in /Users/yanni/Sites/Hosts/breadbreaker.dev/config/ProjectConfiguration.class.php on line 3

The file paths for the require statement in the ProjectConfiguration.class.php file were generated on my home computer, which was configured to use the MacPorts pear, which installs Symfony at /opt/local/lib/php.

So I thought to check which pear installation I was using:

[#!shell]
$ which pear
/opt/local/bin/pear

Huh. That’s… actually (correctly) the MacPorts one. Next, I thought to check where my Symfony package was installed:

[#!shell]
$ which symfony
/usr/local/bin/symfony

“Ah!” I thought with relief at the promise of closure, “It’s using a version of Symfony I’d installed before I’d installed MacPorts’ pear.” Then I thought I’d confirm that I still had the old version of pear laying around:

[#!shell]
$ find /usr/local -name pear
/usr/local/bin/pear
/usr/local/share/pear
/usr/local/share/pear/pear.old/symfony/plugins/sfPropelPlugin/lib/vendor/propel-generator/pear
/usr/local/share/pear/symfony/plugins/sfPropelPlugin/lib/vendor/propel-generator/pear

I’d found it. I only wanted to keep a single version of pear libraries on my system (under MacPorts), so I proceeded to uninstall the Symfony package from /usr/local and install it explicitly into MacPorts’ own /opt/local.

[#!shell]
$ sudo /usr/local/bin/pear uninstall symfony/symfony
uninstall ok: channel://pear.symfony-project.com/symfony-1.1.3

$ sudo /opt/local/bin/pear install symfony/symfony
downloading symfony-1.2.8.tgz ...
Starting to download symfony-1.2.8.tgz (2,695,461 bytes)
..........................done: 2,695,461 bytes
install ok: channel://pear.symfony-project.com/symfony-1.2.8

I then proceeded to confirm that Symfony was now installed somewhere within the /opt/local directory branch:

[#!shell]
$ which symfony
/usr/local/bin/symfony

It wasn’t. I then tried to rename the pear files in /usr/local so that they wouldn’t be found, but that didn’t work either. I Googled far and wide, and found my lead in the Pear Documentation website’s article about shared hosting.

I had configured my .pearrc file to explicitly look for installed pear libraries in /usr/local. This setting was even being honored by the pear in /opt/local.

I renamed my ~/.pearrc file to ~/.pearrc.old and attempted to install the Symfony package again. Pear complained about an unknown installation source, which meant I had to “discover” Symfony’s pear channel. Once I’d done this, Symfony installed to the correct location!

Finally, I just dumped the old pear installation under /usr/local and the file now named ~/.pearrc.old, and was fully transitioned to the MacPorts pear.

How do you like them apples?

Lessons

  • Ensure that you’re executing the correct pear script (on Unix, use which to determine absolute path of the script being used)
  • Verify that your php.ini file has got the correct pear installation path in its include path.
  • If you encounter some wonkiness with the inclusion of pear libraries, make sure there isn’t some .pearrc file with vestigial configuration settings messing with you.