如何仅加载一部分已安装的软件包


13

我遇到了一个涉及多个程序包之间交互的错误。为了报告该错误,我需要提供一个可复制的配方来说明问题。这需要加载适当的程序包,但从我的init加载的程序没有其他要求,也没有其他包。做这个的最好方式是什么?

更新

要澄清的是,我熟悉在二进制搜索中筛选.emacs来识别引起问题的代码的概念。在这种情况下,我确切地知道哪些软件包已经引起了问题。我不知道的是如何使用package-系统来加载这几个软件包。

(package-initialize)将加载软件包,但也将加载.emacs.d/elpa目录中的其他所有文件。package-load-list允许我指定要加载的软件包的特定版本,或要明确排除的特定软件包。我需要反向操作-如何为Emacs提供要包含的软件包列表,而不在elpa / package系统中加载任何其他软件包。


如果您已将问题隔离在有限数量的软件包中,则可以尝试从空白.emacs文件开始重现该问题-逐个安装每个软件包,然后查看问题是否仍然存在。您可能会感到惊讶,并发现与其他程序包搭配不好的程序包。如果您已竭尽所能,请写下用于重现问题的步骤并提交错误报告-例如,从Emacs -Q开始,安装软件包A,然后安装软件包B,再安装软件包C,然后打开*Scratch*缓冲区并键入...
律师名单

@lawlist说了什么。如果您不确定已经完全缩小了范围,请使用二进制搜索:删除代表问题的任意1/2(例如,从4中删除2 pkg)。然后删除3 / 4、7 / 8,...,每次将其复制一半所需的代码。您可以类似地将给定pkg的代码切成1/2等,以将内容缩小到可以再现的很小一部分代码。您可以使用command 注释掉文本区域comment-region(或使用C-u取消注释)。
2015年

我在伪代码级别理解这一点。我不明白如何使用命令的package系列来仅加载其中一部分软件包。emacs.d / elpa目录
Tyler,

以前,维护人员表示我正在使用package-initialize加载所有内容,但我不确定如何避免此github.com/emacs-ess/ESS/issues/140
Tyler

1
package-load-list 一种显式包括软件包的方法,只需删除all符号即可。
npostavs 2015年

Answers:


10

package-load-list变量可用于精确指定要加载的软件包和版本:

List of packages for `package-initialize' to load.
Each element in this list should be a list (NAME VERSION), or the
symbol `all'.  The symbol `all' says to load the latest installed
versions of all packages not specified by other elements.

For an element (NAME VERSION), NAME is a package name (a symbol).
VERSION should be t, a string, or nil.
If VERSION is t, the most recent version is activated.
If VERSION is a string, only that version is ever loaded.
 Any other version, even if newer, is silently ignored.
 Hence, the package is "held" at that version.
If VERSION is nil, the package is not loaded (it is "disabled").

唯一需要注意的是,默认值包括all,如果您使用默认值,则可以setq,因为它会完全覆盖原始值。

(require 'package)
(setq package-load-list
      '((package1 "4.2")
        (package2 "0.5.1")))
(package-initialize)

4

在正在开发该错误的开发人员可能尚未(或想要)安装这些依赖项的情况下,一种可以很好地工作的选项是使用该try软件包(https://melpa.org/#/try)。其他人可以从软件包管理中加载软件包,而无需修改其本地安装。

(package-install 'try)
(require 'try)

(try 'some-package)
(try 'some-other-package)

(steps (to reproduce) (the (problem)))

2

这个用例是一个严重的缺陷package.el,所以不要使用package.el。相反,请使用像straight.el(我是作者)这样的软件包管理器,该软件包管理器专门用于支持此用例。

有关详细的文档straight.el(包括与其他软件包管理器的比较),请参见README。在下面,我引用了与您的问题相关的部分。

使用straight.el重现bug

我要写的主要原因之一straight.el是现有的程序包管理器不适合重现错误。例如,初始化软件包管理器时,其中一些将加载所有已安装的软件包!显然,这对于“最小测试用例”是不可接受的。

相反,引导程序straight.el除了straight.el自身之外不会加载其他任何东西(默认配方存储库已注册,但直到需要时才克隆)。通常,您应该straight.el通过bootstrap片段进行加载,但是当您进入时emacs -Q,可以通过以下方式进行初始化 straight.el

M-x load-file RET ~/.emacs.d/straight/bootstrap.el RET

您也可以从命令行中创建别名,方法是:

$ emacs -Q -l ~/.emacs.d/straight/bootstrap.el

假设您要为Projectile提交错误报告。要仅加载Projectile及其所有依赖项,请运行:

M-x straight-use-package RET projectile RET

请注意,这将使用Projectile的当前已检出修订版及其所有依赖项,因此,应注意这些内容,以便进行错误报告。


0

当您需要一次性使用(例如尝试测试配方以重现错误)时,通常可以逃脱:

emacs -Q -l ~/.emacs.d/elpa/<pkg>-<vers>/<pkg>-autoloads.el

我说“经常”是因为它不会关注依赖项,因此在某些情况下,您需要添加更多的这些-l ...args来加载所需的其他程序包。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.