在init.el开头调用(package-initialize)有什么问题?

如果只准备兼容25以上版本的话,会有什么问题?因为我发现大家几乎都不这么做。

目前我观察到的一个问题就是:package-install不会加载所有的源,必须手动刷新。 但是如果package-initialize放在elpa源设置之后,就没这问题。

要在用到 elpa 安装的包之前调用 package-initialize

文档是这么说的:

package-initialize is an interactive autoloaded compiled Lisp function
in ‘package.el’.

(package-initialize &optional NO-ACTIVATE)

Load Emacs Lisp packages, and activate them.
The variable ‘package-load-list’ controls which packages to load.
If optional arg NO-ACTIVATE is non-nil, don’t activate packages.
If ‘user-init-file’ does not mention ‘(package-initialize)’, add
it to the file.
If called as part of loading ‘user-init-file’, set
‘package-enable-at-startup’ to nil, to prevent accidentally
loading packages twice.
It is not necessary to adjust ‘load-path’ or ‘require’ the
individual packages after calling ‘package-initialize’ -- this is
taken care of by ‘package-initialize’.

调用 (package-initialize) 之后:

  • 加载 package-load-alist 所指定(默认是 '(all))的 packages。
  • 设置 package-enable-at-startup,防止 package 重复加载 // 如何验证?
  • 不必(不应?)修改 load-pathrequire 额外的 package // 没看懂。(package-initialize) 通常放在 init.el 顶层,后面修改 load-path 不是很正常吗?

比较确定的是,在使用 package- 系列函数(例如 (package-install 'dash)) 之前必需调用 (package-initialize)

第三点应该指的是package.el会自动添加load-path,不用你再手动添加类似于

(add-to-list 'load-path (expand-file-name "elpa" user-emacs-directory))

这样的代码了。

总之我原来在init.el的顶端调用package-initialize的时候,总是遇到package-install只能安装GNU elpa包的情况,后来换到添加源之后再调用,就没问题,不过启动速度就……

package-initialize 之前不先设置 package-archives 的话,自然就只会加载 GNU ELPA 的 Archive,因为默认的源只有 GNU ELPA 一个。

至于 (package-initialize) 的耗时,确实不容易控制,因为考虑到可能主要由 archive-contents 的大小、你安装的 Package 的数量以及这些 Package 的作者写的 Autoload 所决定的。

就我这里用了 GNU/Org/Melpa 这三个源,共装了约 1600 个包,(package-initialize) 用时约 11 秒,不知算快还是慢,但我自己还可以接受。


0 (length package-alist) => 160

1 (message "Elapsed time: %fs" (car (benchmark-run 1 (package-initialize)))) => Elapsed time: 1.028814s

然而当我在init.el开头调用package-initialize时,会比在子文件中调用减少大约300毫秒的启动时间……我不知道我哪儿做错了

emacs 27.0之后不再需要调用package-initialize了呀

(when (version< emacs-version "27.0") 
  (package-initialize))
1 个赞

package.el的Emacs都不需要手动添加(package-initialize) Emacs启动的时候会自动运行的