I seem to keep switching between Ubuntu and Fedora every 6 months, for various reasons. I think switching is good for you in that it allows you to evaluate the benefits of each distro, and also encourages you “travel light” as it were, discouraging one-off hacks that you’ll have to figure out each and every time you change distro (or potentially upgrade). That’s not to say I don’t do a heck-tonne of customisation, but I do it in a structured, repeatable and (when possible) cross-distro manner.
To be honest, the main thing that irks me is having to remember to mentally switch between apt-get/dpkg
and yum/rpm
. I try to declare package dependencies for tools I commonly use or libraries I depend on in a cross-platform way using zero-install feeds (this really helps when switching, since I don’t have to remember the differing names of many packages), but inevitably I still need to use the command-line package managers fairly often.
Today I ran across fpm (“Effing Package Management”) again, which is a tool that a (likely frustrated) user has built to abstract away the uninteresting details of building packages for such-and-such package manager. It turns out that system packages are boring, and do pretty much the same thing in 99% percent of cases. The other 1% is probably a bad idea, or obscure enough of a feature that you’ll do it wrong. I took a closer look to see if it also dealt with the uninteresting inconsistencies of using a package manager to search for an install packages, but no such luck.
Enter pkcon
Fortunately, a pretty decent tool is already available, and already installed in many modern distros. It’s called pkcon
, and it’s part of the PackageKit project to provide a consistent API for the common operations across the plethora of linux package managers. PackageKit has a whole heap of supported backends, most likely more than you’ve even heard of. It covers the basic operations that are generally present in all package managers, it does not attempt to expose advanced features. Fedora’s default package GUI is built on it, and I believe ubuntu’s software center either is already or soon will be built on it it too. It’s also the mechanism by which zero-install can install required system packages as needed on most distros, which earns it a special place in my heart ;)
Using it
Anyway, what can you do with pkcon
? Close to everything I’ve ever needed to. Technically speaking it’s largely a testing tool for exercising the PackageKit API, but (by no coincidence) the PackageKit API happens to be a straightforward set of the main things a user actually cares about. For the most part, the commands are exactly what you’d expect if you’ve used apt
or yum
, and in other cases they make more sense. Here’s a list of the stuff I use, with apt
and yum
equivalents for context:
install (apt-get install
, yum install
)
$ pkcon install [packagename]
remove (apt-get remove
, yum remove
)
$ pkcon remove [packagename]
check for updates (apt-get update
, yum check-update
)
upgrade all packages (apt-get upgrade
, yum update
)
search (apt-cache search
, yum search
)
$ pkcon search [name|details|group|file] [query]
file
is pretty useful when you want to find “who owns that file on my hard drive”, but unfortunately you can’t use wildcards to find files you’re missing but don’t know the full location of (at least it’s not working for me). Still, good for satisfying poorly-documented build dependencies that are expecting certain files to exist.
what-provides (rpm -qf
, dpkg -S
)
$ pkcon what-provides /usr/bin/python
Seems to be the same as pkcon search file
above. Much easier to remember than the rpm/dpkg flags.
get-details (apt-cache show
, yum info
)
$ pkcon get-details [packagename]
I mainly use this for getting the version of a package installed, or to check that a given package is what I want to install.
get-files (dpkg -L
, rpm -ql
)
This one even works on packages you haven’t installed, unlike both dpkg
and rpm
.
User Beware
Unfortunately, pkcon
is not without its rough edges. While the package management actions are well-tested, the command line itself is a bit flaky. For example, both --help-all
and refresh --force
give parse errors on Fedora 17, despite being recommended in the help text. More importantly the --filter=installed
flag does nothing on my system. Without that filter, you will need to disambiguate (by picking from a numbered list) whenever you perform an action on a package that is installed but also has an available update, or which is available in both 32 and 64 bit versions.
It also requires DBus
as a dependency (since PackageKit is implemented as a DBus API), which may make it a poor option for administering servers. But you probably shouldn’t be doing most of this manually on a server anyway.