如果只准备兼容25以上版本的话,会有什么问题?因为我发现大家几乎都不这么做。
目前我观察到的一个问题就是:package-install不会加载所有的源,必须手动刷新。 但是如果package-initialize放在elpa源设置之后,就没这问题。
如果只准备兼容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-path
或 require
额外的 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))
有package.el
的Emacs都不需要手动添加(package-initialize)
Emacs启动的时候会自动运行的