We’ve worked on this for the past two years and have finally reached an acceptable state where we don’t end up pulling in hundreds of packages.
While initial implementations of things like the email message parser and the DAV and IMAP library brought huge dependencies like KIO, DBus and even Akonadi (that would arguably have been resolvable on a packaging level, but… not a great situation anyways). With all that removed Kube now depends on ~75 packages less (the exact number will depend on factors such as your distros packaging), as well as drastically reducing it’s runtime entanglement (we no longer need dbus, klauncher, external KIO processes, …).
The new dependency situation looks approximately like this:
- Qt: (We’ll bump that soon to 5.9 for some Qt Quick Controls2 improvements, and then plan on staying on this LTS release)
- KIMAP2: Used for IMAP access, depending on KMime and Qt.
- KDav2: Used for DAV access, depending on Qt.
- KAsync: A pure Qt library that is extensively used in Sink.
- KMime: Used for mailparsing, depending on Qt.
- KContacts: Used for parsing VCard, depending on Qt.
- lmdb: Our key value-store that is a simple C library.
- flatbuffers: Also part of our storage and a simple self-contained C++ library.
- QGpgme: Part of gpgme, used for crypto stuff.
- KCodecs: A tier1 framework used for some parsing tasks.
- KPackage: A tier2 framework for packaging qml.
- KCoreAddons: A tier1 framework that we need for KJob.
- libcurl: Currently used for its SMTP implementation.
And that’s about it. This means we’re now in a situation where each and every dependency that we have is justified and there for a reason. We’re also in a position where most dependencies can be individually replaced should there be a need to so.
This not only makes me much more confident that we can maintain this system in the long run and makes porting to other platforms feasible, it’s also just a much, much healthier situation to be in for a software project.
In case you are wondering, here’s an incomplete list of packages that we used to depend on and no longer do (based on Fedora 25 packaging, check out rpmreaper to recursively query dependencies):
grantlee-qt5 kdepim-apps-libs kf5-akonadi-contacts kf5-akonadi-mime kf5-akonadi-search kf5-akonadi-server kf5-akonadi-server-mysql kf5-grantleetheme kf5-kauth kf5-kbookmarks kf5-kcalendarcore kf5-kcompletion kf5-kconfig-gui kf5-kconfigwidgets kf5-kdbusaddons kf5-kded kf5-kdelibs4support kf5-kdelibs4support-libs kf5-kdoctools kf5-kemoticons kf5-kiconthemes kf5-kidentitymanagement kf5-kimap kf5-kinit kf5-kio-file-widgets kf5-kitemmodels kf5-kldap kf5-kmailtransport kf5-kmbox kf5-knewstuff kf5-knotifications kf5-kparts kf5-kpimtextedit kf5-krunner kf5-kservice kf5-ktextwidgets kf5-kunitconversion kf5-kwallet-libs kf5-kwidgetsaddons kf5-kwindowsystem kf5-kxmlgui kf5-libgravatar kf5-libkdepim kf5-libkleo kf5-messagelib kf5-pimcommon kf5-solid-libs kf5-sonnet-ui kf5-syntax-highlighting kf5-threadweaver libaio libical libsphinxclient lsof m4 mariadb mariadb-common mariadb-config mariadb-errmsg mariadb-libs mariadb-server mariadb-server-utils net-tools perl-DBD-MySQL perl-DBI perl-Math-BigInt perl-Math-Complex perl-Storable postgresql-libs qt5-qtbase-mysql rsync sphinx