用过各种各样的包管理方法(package.el, straighel.el, submodule, borg等),目前使用的是在submodule上增功能的borg,很好用,但有一些小缺点始终觉得不太舒服,
第一是利用submodule的方法在删除包特别是其依赖的时候相对繁琐,经常容易漏。个人倾向于包的安装和配置在一起,而不是单独有一个文件(.gitmodule)来维护,这样只要我删除声明就意味着包的失效和删除,类似于straight那种。第二是submodule的浅克隆和更新混在一起比较麻烦,经常出错。但喜欢borg对特殊build的简化,比straight.el简洁多了。
因此,最近想做一个懒人版的简单包,可能是重复造轮子,目的是为了简洁,透明,同时满足自己的需求。
我大概有以下几个设想
- 完全基于 git, 这样近乎所有的包都可以用统一的方法安装,同时节省大量其他管理方法的代码
- 基于声明式的安装,只要在包的配置里加一句声明就会安装包,删除声明,包就不会被添加到load-path(这里初步想法是自动根据声明语句统计出来一个list,然后对不在list里的包路径进行删除,在list里的包就会自动添加到load-path和自动编译)。
- 完全不自动处理依赖。换而是在安装包的时候直接写把依赖的声明写到这个包旁边,不用的时候就连包带依赖的声明一起删了,这样不会遗漏,而且不怕有一些包被很多包依赖,因为只要有一处声明还在就不会被删除。
- 可以基于命令行控制(更新安装编译卸载),保证了每次打开emacs很干净不会出现乱七八糟的报告或者错误。也可以交互式
- 支持浅克隆和更新,可能就不用submodule了直接用git clone,通过增加一个commit id变量来控制版本
- 支持一键更新和单独更新,更新时会把每个包当前commit的log和最新commit之间的所有log按照一定格式打出,方便快速了解更新了什么,也可以根据commit来回退。
- 支持传递一组形如“make install”的字符串列表给包,用户可以对一些包进行简洁的控制
- 如果对包有pr,就直接在git目录里操作就好
这些想法一气呵成就写出来了,感觉在脑子里萦绕很久了。最开始是想去对straight进行改造,因为他满足了大部分需求,后来感觉straight本身太复杂了,而且很多功能我也用不到。我的预想是包的代码量要小,方便后续维护拓展或者是其他新手的学习。而且我认为管理包时越少的控制,将来越容易排错。
但我没写过包,做出来估计需要一段时间,而且不知道写这种包有没有意义,毕竟这种轮子太多了,大佬们感兴趣求指点一下我
大概像下面这样
(easy-install package-b :host "github" :repo "xxx/package-b" :commit-id "asdsadad") ;; 依赖
(easy-install package-c :host "gitlab" :repo "xxx/package-c" :build "make" "make install") ;; 依赖
(easy-install package-a)
(require 'package-a)
(with-eval-after-load 'package-a
...)