一个软件包可以是 单文件软件包(simple package) 或 多文件软件包(multi-file package)。单文件软件包以单个 Emacs Lisp 文件的形式存放在软件包归档中,而多文件软件包则以 tar 文件形式存放(其中包含多个 Lisp 文件,还可能包含手册等非 Lisp 文件)。
在日常使用中,单文件软件包与多文件软件包的区别并不重要;软件包菜单界面不会对二者加以区分。不过,二者的创建流程有所不同,后续章节会详细说明。
每个软件包(无论单文件还是多文件)都具有若干 属性(attributes):
一个简短的标识符(例如 ‘auctex’)。该名称通常也是程序中使用的符号前缀(see Emacs Lisp 编码规范)。
符合 version-to-list 函数识别格式的版本号(例如 ‘11.86’)。软件包每次发布更新时都应提升版本号,以便用户查询软件包归档时能识别为升级版本。
会在软件包菜单列表中显示。应当为单行文本,理想长度不超过 36 个字符。
会在 C-h P(describe-package)创建的缓冲区中显示,位于软件包简要描述与安装状态之后。通常为多行文本,需完整说明软件包功能以及安装后的基本使用方法。
该软件包所依赖的其他软件包列表(可包含最低兼容版本号)。该列表可为空,表示此软件包无任何依赖。否则安装此软件包时会递归自动安装其依赖;若任意依赖无法找到,则该软件包无法安装。
通过 package-install-file 命令或软件包菜单安装软件包时,会在 package-user-dir 下创建一个名为 name-version 的子目录,其中 name 为软件包名称,version 为版本号(例如 ~/.emacs.d/elpa/auctex-11.86/)。我们将其称为该软件包的 内容目录(content directory)。Emacs 会将软件包内容存放于此(单文件软件包为单个 Lisp 文件,多文件软件包为解压后的所有文件)。
随后 Emacs 会在内容目录的所有 Lisp 文件中搜索自动加载魔法注释(see 自动加载)。这些自动加载定义会保存到内容目录中名为 name-autoloads.el 的文件里。它们通常用于自动加载软件包中定义的主要用户命令,也可执行其他操作,例如向 auto-mode-alist 中添加条目(see Emacs 如何选择主模式)。注意,一个软件包通常 不会 自动加载其内部定义的所有函数与变量—只加载常用的入口命令。之后 Emacs 会对软件包内所有 Lisp 文件进行字节编译。
安装完成后,已安装的软件包会被 加载(loaded):Emacs 将软件包内容目录加入 load-path,并执行 name-autoloads.el 中的自动加载定义。
每次 Emacs 启动时,会自动调用 package-activate-all 函数,使已安装软件包在当前会话中可用。该过程发生在加载早期初始化文件之后、加载常规初始化文件之前(see 概述:启动时的操作序列)。若用户选项 package-enable-at-startup 在早期初始化文件中被设为 nil,则软件包不会自动启用。
该函数使软件包在当前会话中生效。用户选项 package-load-list 指定哪些软件包可用;默认情况下所有已安装软件包均会启用。
See Package Installation in The GNU Emacs Manual。
大多数情况下无需手动调用 package-activate-all,因为启动过程会自动执行。只需将需要在 package-activate-all 之前运行的代码放入早期初始化文件,将需要在其后运行的代码放入主初始化文件即可(see Init File in The GNU Emacs Manual)。
该函数初始化 Emacs 内部已安装软件包的记录,随后调用 package-activate-all。
可选参数 no-activate 若非 nil,则 Emacs 仅更新已安装软件包记录,而不实际启用它们。