新包:pie - package installer for Emacs

EDIT: 修改了下:rev和:branch的含义,:branch用来指定分支或者tag,:rev用来指定commit。这样就可以锁定到某个commit了(目前仅支持git)。

EDIT2:去掉了pie-directory,添加了两个:pie-repos-directorypie-builds-directory,分别配置源码目录和构建目录。

之前基本是用内置的package.el,但是有两个不爽的地方:

  1. 同一个仓库可能会被拆成多个包。这样有好有坏,不过我不喜欢。
  2. 不支持可选依赖,导致有些不需要的包也装上了。

所以花了些时间实现了一个简单的包,代码在 PIE

总体很简单,单纯用来安装包的。有这些特性:

  1. 下载代码支持通过内置的vc克隆或者http直接下载
  2. 支持指定分支,也支持指定tag之类的ref
  3. 自动生成autoloads文件并加载
  4. 可以表达依赖关系(这个功能其实不是必要的,不过有了可以一眼知道依赖哪些包)
  5. 可以自己指定如何构建包(有个默认的实现–自动把el编译为elc并生成autoloads)

安装包的逻辑是这样的:

  1. vc-clone或者http下载代码到pie-directory下的repos文件夹
  2. 然后将代码复制到pie-directory下的builds文件夹
  3. 在builds下的包目录下build代码,并生成autoloads文件
  4. 将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

注意:

  1. 访问github不畅的慎用
  2. 应该还会有些小bug。
12 个赞

不支持锁定到特定的 commit 吗?

等我实现一下 :)

1 个赞

现在支持了(仅git支持)。

通过:rev指定commit就可以了。

1 个赞

pie-directory 设置了没用,我看源码里面根本就没有这个变量。跟路径相关的是 pie-repos-directorypie-builds-directory

当时发帖的时候pie-directory还是有的,另两个目录当时是实现为两个函数,分别返回的是pie-directory下的repos和builds。

后来觉得有的人可能会尝试不同的Emacs版本,所以builds还是根据Emacs版本分别设置为好(怕elisp有向前兼容问题),就干脆把pie-directory去掉了,加了这两个新的。

OK, 能用上的,就想找一个这种简单的包安装工具嘻嘻

哈哈,同好同好。有问题可以提issue,我在github上也建了个仓库,在PIE

(pie "pkg" "xxx") 是不是相当于 require 这个包呀。我想的只是下载和建构,但什么时候调用应该自己来控制

没有require这个包,require的是生成的autoload。如果不想要这个行为,可以自己实现个空的pie--active-package

另一个改动方式是加个配置项,控制是否要加载autoload。欢迎提交pr :slightly_smiling_face:

包名(包括 :deps)去掉引号会更好些。

感谢建议。

当时还小小的纠结了一下用什么,因为一直比较喜欢string这个数据类型,拼接目录的时候也不需要symbol-name,所以就用了它。

缺点就是写起来麻烦点。不改了,就这样吧。