Как загрузить только подмножество установленных пакетов

13

Я столкнулся с ошибкой, связанной с взаимодействием нескольких пакетов. Чтобы сообщить об ошибке, мне нужно предоставить воспроизводимый рецепт, иллюстрирующий проблему. Это требует загрузки соответствующих пакетов, но ничего другого из моего init, и никаких других пакетов. Каков наилучший способ сделать это?

ОБНОВИТЬ

Чтобы уточнить, я знаком с концепцией просеивания моего .emacs в двоичном поиске, чтобы определить код, вызывающий проблему. В этой ситуации я точно знаю, какие пакеты уже вызывают проблему. Чего я не знаю, так это как использовать package-систему для загрузки только этих нескольких пакетов.

(package-initialize)загрузит пакеты, но и все остальное в моем .emacs.d/elpaкаталоге. package-load-listпозволяет мне указать конкретные версии пакетов для загрузки или конкретные пакеты для явного исключения . Мне нужно обратное - как предоставить Emacs список пакетов для включения без загрузки других пакетов в систему elpa / package.

Тайлер
источник
Если вы изолировали проблему с конечным числом пакетов, то вы можете попытаться воспроизвести проблему, начав с пустого .emacsфайла - установите каждый пакет по одному и посмотрите, сохраняется ли проблема. Вы можете удивить себя и найти ответственный пакет, который не очень хорошо сочетается с другим пакетом. Когда вы продвинетесь настолько далеко, насколько сможете, запишите шаги, которые вы использовали для воспроизведения проблемы, и отправьте отчет об ошибке - например, начиная с Emacs -Q , установите пакет A, затем установите пакет B, затем установите пакет C, затем откройте *Scratch*буфер и наберите ...
lawlist
Что сказал @lawlist Если вы не уверены, что полностью сузили ситуацию, используйте бинарный поиск: удалите произвольную половину того, что у вас есть, что повторяет проблему (например, удалите 2 pkgs из 4). Затем удалите 3/4, 7/8, ... обрезая код, необходимый для повторения его пополам каждый раз. Аналогичным образом вы можете нарезать код данного pkg на 1/2 и т. Д., Чтобы сузить круг до очень маленького кода, необходимого для его повторного воспроизведения. Вы можете использовать команду, comment-regionчтобы закомментировать (или C-u, чтобы, раскомментировать) область текста.
Дрю
Я понимаю это на уровне псевдокода. Я не понимаю, как, используя команды семейства пакетов, вы загружаете только подмножество пакетов в свой. Справочник emacs.d / elpa
Тайлер
Ранее сопровождающий указывал, что я загружаю все с помощью package-initialize, и я не уверен, как этого избежать github.com/emacs-ess/ESS/issues/140
Тайлер
1
package-load-list это способ явно включать в себя пакеты, просто удалите allсимвол.
npostavs

Ответы:

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)
npostavs
источник
4

Опция, которая будет работать хорошо в тех случаях, когда разработчики, работающие над воспроизведением ошибки, возможно, еще не установили (или не хотят) эти зависимости, - это использование tryпакета ( https://melpa.org/#/try ). Другие могут загружать пакеты из управления пакетами без изменения их локальной установки.

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

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

(steps (to reproduce) (the (problem)))
ebpa
источник
2

Этот вариант использования является ужасным недостатком package.el, поэтому не используйте package.el. Вместо этого используйте менеджер пакетов типа straight.el(я автор), который был специально разработан для поддержки этого варианта использования.

Подробную документацию straight.el, включая сравнения с другими менеджерами пакетов, смотрите в README . Ниже я процитировал раздел, который относится к вашему вопросу.

Использование straight.elдля воспроизведения ошибок

Одной из основных причин, по которой я хотел написать, straight.elбыло то, что существующие менеджеры пакетов не были хороши для воспроизведения ошибок. Например, некоторые из них будут загружать все установленные пакеты при инициализации менеджера пакетов! Очевидно, что это не приемлемо для «минимального теста».

Напротив, при начальной загрузке straight.elничего не загружается, кроме straight.elсамого себя (репозитории рецептов по умолчанию регистрируются, но не клонируются, пока не понадобятся). Обычно вы должны загружать straight.elс помощью фрагмента начальной загрузки , но когда вы находитесь внутри 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 ...аргументов для загрузки других необходимых пакетов.

Стефан
источник