今天发布了云音乐 1.1 版, 并不开心. 这些天被这一堆的桌面问题 坑得无语. 分两部分说吧.

差得不能再差的包管理工具

嗯, 同一个发行版, 不同的系统版本, 包名竟然不一样. 而且, Debian/deb 系的, 尤其喜欢拆包, 一个好好的软件包, 拆成一堆的小包, 一个 VLC 播放器, 被拆成了 十几个包. 更可恶的, Ubuntu 16.04 与 Ubuntu 17.10 上面, VLC 的解码器 被放到了不同的包里, 前者是 vlc-nox, 后者有 vlc-plugin-base, 但是还得 安装 vlc-bin. 这是自找没趣, 闲得没事儿干. 他们拆包时, 并没有为这个软件包 加入什么新的功能, 反而把一些包改得没了样子.

嗯, 除了deb系, 还有 rpm/dnf 系. 然后对于一般开发者来说, 就得考虑兼容它们了, 但是哪有那么容易? 要小心地处理依赖包, 而且还要在各个发行版上面测试.

当然, 开发时, 也可以做绝一些, 就像 chromium 那样, 把所有的依赖都加到代码库里面, 但是这编译速度, 谁编过谁最清楚.

“百花齐放”的桌面环境

对的, 有 Gnome, KDE, xfce, 还有死了的 Unity 还有其它排不上名的一大堆. 都要兼容. 尤其是设计图上要求要自绘窗口的外框时, 更时坑爹.

chromium 都快十年了, 在 Linux 上面的桌口时不时还有冒出来问题. 类似的 steam 客户端, 它那个灰色的窗口也是问题不断.

怎么绕过这些坑?

首先, 最基本的, 不要调用桌面环境特有的接口, 比如更新桌面壁纸的 dbus 接口, 禁止休眠的 dbus接口.

其次, 不要自绘窗口, 更不要调用 X11 的接口, 但是有的时候实在是没有办法的, 比如要 实现全局快捷键!

不要使用系统托盘, 因为托盘现在有两套接口, 而且, Gnome shell 上面, 现在已经不再显示 托盘了! 应用最小化到托盘后, 你就找不着了!

尽量使用标准接口, 比如 xdg-open 或者类似的 freedesktop 提供的几个有限的 dbus 接口.

不要使用 keyring/kwallet, 没错, 你要考虑, 有没有 keyring, 或者有没有 kwallet, 或者 它们俩都没有被提供时的情况.

如果可能, 不要写本地GUI程序, 转到 web 吧.

为什么会有这些坑?

首先, 绝不是技术的问题, 在技术上, 其实好些桌面环境提供的小功能都很好用, 但是它们都没有 能成为标准, 其它桌面环境, 又从头再搞一套, 它们还彼此不兼容.

社区精力太分散, 它们之间似乎有着几世的仇恨.

freedesktop 影响力太有限. 定义出来的标准接口太少, 而且就这还不被某些桌面环境遵守.

好消息是, Gnome 可能会成为那个突出的桌面环境, 被 Canonical 以及 RedHat 支持.