这个周末其实只打算维护下我的 upstream-notifier 的😂。好吧原来我只是想更新几个软件包,结果觉得既然都去更新包了,不如把给 upnoti 用的 json 也写了。

写的过程中要测试,发现 github 上面的有些项目的 release page 底下没有内容,于是又改 upnoti 的 github mod 支持这种情况。然后又觉得 upnoti 太慢,加了 multithread 支持,然后又开始优化性能,代码风格之类的。

好不容易搞定了,这时 home:opensuse_zh 已经更新完几个包了,没法生产环境测试了,又去 d:l:go 里把 docker 的几个依赖抓回来,发现 golang-packaging 在 sles11 上面 test 宏出错,又给自己加了一项工作任务。

然后在 features.opensuse.org 上看到有个人要 tox 整合进 openSUSE,想起来我还维护着 cutegram 和 qtox,于是去更新 cutegram。

结果觉得我的用 _service 抓 git 的软件包这么多,每次更新基本都是无脑的,干嘛不做个自动化工具呢?于是 obs-scm-autoupdater 就这么诞生了😈

写完 osa 的基本功能,又开始怀疑人生了。rpm 打包这么难,新手不爱学啊!就连我自己也经常是本来要简简单单安装个软件,比如 vokoscreen,录个视频给 konsole 的人看 bug,结果看到 vokoscreen 版本太低去更新,就把报 bug 这事岔开了。生产力就是这么低的!打包不应该那么耗时间,应该简单得像本机编译一样,甚至比那个还简单,新手才喜欢。

关于这个问题有三个办法:

第零个是不学打包直接本地编译。我烦死本地编译了,之前本地编译安装了个 basket,后来时间长了把源代码删了,没法 make uninstall,有洁癖的我就又编译了一遍就是为了卸载掉。哦对了 basket 有 kde5port 了!我当年想学 c++ 其实就是为了维护这个项目,虽然我各种待办事宜软件搞了不少,其实有 todo 的时候多半还是用脑子记,因为要么那时手头没工具要么人太烂,就好比我是学金融的却没老老实实用 skrooge 这样的手帐软件记满哪怕一个月,嘿嘿

第一个是在现有的包管理系统里选个最简单的学。但是 openSUSE 的 rpm 是最难的那个,总不能换系统吧=。= puppy linux 的包管理在我看来最省心,但是不好移植啊。check_install 我又看不上。

第二个就是自己做一个“比本地编译简单或者至少差不多,学习成本不高,省心的”包管理系统。类似 puppy linux 那种。好吧我其实又选了最难的选项,强迫症就是如此啊!

于是就有了这个 epm。我号称它是最简单的包管理系统,给我这种贪懒奸猾的人用的😂。

设计起来想的挺简单的。

configure 命令自动判断是 autotool,cmake,qmake 还是别的工程(看源代码目录就知道),然后不管它调用什么我这里一律是 easy_configure。你说参数?直接 passthrough,省心,原来能用什么现在就能用什么,最多 runtime tweak 一下 libdir 什么的让它指向我定义的编译专用目录 easy_build。

make 就不管了,make_install 改成 easy 命令,也是接受参数确保装到 easy_build 又不让新人感觉到。

最后 easy_pack。直接压成一个 tar.xz 改名叫 .epm 好啦:-)

很快就写完了。这时才发现自己还没写怎么装这个 epm 的工具。原来想的是直接复制过去就好啦,弄个最傻的 sqlite3 数据库保存下名字、版本和文件列表这些 metadata 就好啦。

但想到还有依赖关系和安装时候的那些 pre/post/preun/postun 脚本。

依赖关系想弄成文件级别的,就是解包之后扫描下,是 c/c++ 的就用 ldd 去找关键性文件,类似这样。反正新手用的基本就是 c/c++/python 这种工程,覆盖面不够可以后期增补嘛,这难道不就是快速迭代嘛!

又想到依赖的文件都找到了,干脆调用 libzypp 和其它发行版上现有的包管理系统去 query 一下这个发型版的包名称嘛!就比如 chrpath-1.16.x86_64.epm 依赖的可能是 gcc.rpm 也可能是 gcc.deb。只记录包名,不强制依赖,新手打包可以写进去,安装时会提示要不要装(当然那时依赖的版本肯定有更新了,但先不去管它)也可以让 epm 主程序在安装时自行确定,至于准确率嘛,偶尔装错两个反正有现有的包管理系统管着也无伤大雅。实在找不到再看有没有提供它的 epm,再没有就报错。反正其实用到 epm 也就是新人想保存一下编译安装的成品,不太会别的东西还依赖这个成品的。

至于 pre/post 脚本,最重要的是它们的位置。什么时候调用这个都明白,但是它们本身在哪儿呢?解压过 rpm 但没看到过呀!研究了下发现 rpm file format 是自带 metadata 的,就是生成 rpm 的时候就弄进那个文件里了,你 unrpm 出来的其实只是 data。好吧,太难了,一比一复刻 rpm 制式太麻烦,干脆就 debian 风格好了。打包时多弄进去一个 epm 文件夹,脚本都在里面,安装时让主程序在复制文件到用户系统时候忽略就好了!

然后整理下发现自己幻想了好多,其实一开始就是想更新几个软件包的…活就是这么来的。我这也算是自我驱动了…

PS:我的博客又由 hexo 切换到 ghost 了,因为 ghost 可以在手机上码字。什么年代了谁还会坐在电脑前中规中矩的写博客!