From the Terminal
The case for system wide dependency injection in PHP
So first let me clarify what I mean when I say "system wide dependency injection".
The typical PHP Composer project offers "project-wide" dependency injection. The autoloader is made for your project and you simply require that one file. However, with other languages it's typical for dependencies to be in a shared folder for the entire system.
In composer we could use a "global" directory in global mode as well like this.
The problem is it's only global "for you". So if you decided to run composer global for another user all the packages you have installed would be different. So it's not global. Not even system-wide really since the home directory might not allow read from other users.
So neither of these modes in composer are really system wide.
In other languages system wide dependencies are stored like so.
For example here's Python.
Perl too.
And Ruby.
Okay so what about PHP?
To fill this hole some Linux developers who choose to include PHP code directly in the system have started to build packages for their distro's package managers.
Here we have the install script for symfony-console in portage. You can see the files are actually stored in /usr/share/php. Unfortunately these files don't have automatically generated autoloaders by composer making integrations very messy.
Portage users aren't the only ones.
Clearly some users choose to install PHP code for use system wide.
/usr/share/ or /usr/lib
Let's check the Linux Foundation's documentation on the topic.
Even though PHP code isn't architecture dependent, in my opinion, it's more of a library for programming so to that end I think it makes more sense to use /usr/lib or in my case /usr/lib64 just like other scripting languages. It would also avoid the messy businesses of integrating with none composer package managers.
I decided to go ahead and experiment with this idea.
I forked composer and made a composer system command. Just like composer global
sets the folder to ~/.config/composer/
, with the system command it instead sets the folder to /usr/lib64/php
or /usr/lib/php
if they exist in that order. You must create /usr/lib{64}/php
yourself.
The fork of composer is available here: https://github.com/hparadiz/composer
I then loaded in some really awesome PHP libraries.
With this newfound power to no longer have to bundle libs with my scripts I made a database backup utility for this blog in 50 lines of code with SSH tunneling that drops sql.gz to my local home folder.
Feel free to fork it and make your own.
I had the script output to a Dropbox folder since I have it running already. Which is awesome since that's three locations and one of them is managed for me. I'll be hacking at this some more but for now I like this starting place.
I like that this script is fully portable and editable wherever it is. If I compile it to a phar it would be difficult to make changes or loop it for multiple databases without setting up an entire build configuration despite that logic being relatively simple even for a novice.
For me, at least, the reasons to allow composer to manage dependencies at a system wide level instead of having other package managers do it is self evident.
Solving Dependency Slot Conflicts in Gentoo Elegantly
Sometimes when you want to emerge something or upgrade something you will have dependency slot conflicts like this example.
To fix this problem you'd need to emerge all kde-frameworks/* packages you currently have installed to upgrade them all at once since it's all part of one framework.
The following commands let you do so with ease.
equery l kde-frameworks/* -F '$category/$name'
The output of which you can send right into emerge like so.
sudo emerge --ask -1 --verbose-conflicts $(equery l kde-frameworks/* -F '$category/$name')
Now you'll hopefully get a clean emerge.