我的package.el配置如下所示:
(defvar gnu '("gnu" . "http://elpa.gnu.org/packages/"))
(defvar melpa '("melpa" . "http://melpa.milkbox.net/packages/"))
(defvar org-elpa '("org-elpa" . "http://orgmode.org/elpa/"))
(add-to-list 'package-archives gnu t)
(add-to-list 'package-archives melpa t)
(add-to-list 'package-archives org-elpa t)
(defvar el/installed-packages
(list
(list 'org org-elpa)
(list 'org-plus-contrib org-elpa)
(list 'orgbox melpa)
)
"List of packages to be installed")
(package-initialize)
(unless (and (file-exists-p "~/.emacs.d/elpa/archives/gnu")
(file-exists-p "~/.emacs.d/elpa/archives/org-elpa")
(file-exists-p "~/.emacs.d/elpa/archives/melpa"))
(package-refresh-contents))
(defun el/packages-install (packages)
(mapc (lambda (pkg)
(let ((name (nth 0 pkg))
(repo (nth 1 pkg)))
(when (not (package-installed-p name))
(message "Downloading '%s' ..." name)
(let ((package-archives (list repo)))
(package-initialize)
(package-install name)))))
packages)
(package-initialize)
(delete-other-windows))
(condition-case nil
(el/packages-install elinstalled-packages)
(error
(package-refresh-contents)
(el/packages-install el/installed-packages)))
Run Code Online (Sandbox Code Playgroud)
当然,中列出了更多的软件包el/installed-packages。
在启动时,emacs会抱怨
错误:软件包“ org-8.0”不可用
列为orgbox软件包的依赖项。然而,价值org-version就是8.2.7c,所以应该不会再失败!
使我感到困惑的是,尽管该文件夹存在,但该~/.emacs.d/elpa子目录不包含org-$VERSION$子org-plus-contrib-$VERSION$文件夹。似乎package.el没有org从org-elpa归档文件安装软件包,仅org-plus-contrib安装了软件包。也许问题与orgbox此有关?
Org是内置软件包,因此始终安装在Emacs中。因此,(package-installed-p 'org) 始终返回一个非null值,这将防止Org 8被安装el/packages-install。
从Emacs 24.3开始,内置的Org为7.x,但是最新版本不足以满足的要求orgbox。通常,package.el足够聪明,可以自动安装所需的Org 8.x,但是由于您在安装时隐藏了GNU ELPA档案orgbox,因此package.el无法解决依赖关系,从而导致您看到的错误。
org-version来自org-plus-contrib,顾名思义,它也包含所有Org Mode,因此Org Mode 8实际上存在于您的Emacs中。但是,由于软件包名称不同(org-plus-contrib与相对org),因此不能用于解析对org软件包的依赖性。
可以说,这是package.el的一个缺点,它不支持“虚拟”和“提供”的软件包,但也是Org Mode打包的结果。
要解决此问题,您可以更改el/package-install通过检查来检查Org的安装版本package-alist,但我建议您不要package-archives在该函数中弄乱。值得注意的是,你应该不是从列表中删除GNU ELPA,因为它包含必须适用于大多数程序包完全安装必要的软件包。您在使用此功能时遇到麻烦。
在Emacs 24.3中,根本没有合理的方法将软件包固定到特定的档案中。如果您要这样做,请更新到Emacs 24.4的最新预测试,然后进行相应设置package-pinned-archives。如果这样做,您甚至不需要安装Org,因为Emacs 24.4已经包含Org 8。