EDIT: 修改了下:rev和:branch的含义,:branch用来指定分支或者tag,:rev用来指定commit。这样就可以锁定到某个commit了(目前仅支持git)。
EDIT2:去掉了pie-directory
,添加了两个:pie-repos-directory
和pie-builds-directory
,分别配置源码目录和构建目录。
之前基本是用内置的package.el,但是有两个不爽的地方:
- 同一个仓库可能会被拆成多个包。这样有好有坏,不过我不喜欢。
- 不支持可选依赖,导致有些不需要的包也装上了。
所以花了些时间实现了一个简单的包,代码在 PIE 。
总体很简单,单纯用来安装包的。有这些特性:
- 下载代码支持通过内置的vc克隆或者http直接下载
- 支持指定分支,也支持指定tag之类的ref
- 自动生成autoloads文件并加载
- 可以表达依赖关系(这个功能其实不是必要的,不过有了可以一眼知道依赖哪些包)
- 可以自己指定如何构建包(有个默认的实现–自动把el编译为elc并生成autoloads)
安装包的逻辑是这样的:
- vc-clone或者http下载代码到
pie-directory
下的repos文件夹 - 然后将代码复制到
pie-directory
下的builds文件夹 - 在builds下的包目录下build代码,并生成autoloads文件
- 将builds下的包目录加到load-path,并加载autoloads文件
我自己的一些配置:
(add-to-list 'load-path "~/.emacs.d/packages/pie")
(require 'pie)
(setq pie-repos-directory "/path/to/package/repos"
pie-builds-directory "/path/to/package/builds")
(pie "s"
"https://github.com/magnars/s.el"
:branch "1.13.0")
(pie "f"
"http://github.com/rejeep/f.el"
:deps '("s" "dash"))
(pie "vundo"
"https://git.savannah.gnu.org/git/emacs/elpa.git"
:branch "externals/vundo")
(pie "bash-completion"
"https://github.com/szermatt/emacs-bash-completion"
:rev "de2c844")
(pie "lspce"
"https://bitbucket.org/zbelial/lspce"
:deps '("markdown-mode")
:build #'(lambda (build-dir)
(let ((default-directory build-dir)
(files (directory-files build-dir t "\\.el$"))
(autoloads (concat (file-name-nondirectory (directory-file-name build-dir)) "-autoloads.el")))
(cl-dolist (file files)
(when (not (string-suffix-p ".dir-locals.el" file))
(byte-compile-file file)))
(make-directory-autoloads build-dir autoloads)
(shell-command "cargo build --release"))))
;;; 最后一定要调用这个方法
(pie-install-packages)
:build 函数带一个参数,是pie-directory/builds
下的包目录。假设有个包A,那就是pie-directory/builds/A
。
注意:
- 访问github不畅的慎用
- 应该还会有些小bug。