Як завантажити лише підмножину встановлених пакетів


13

Я наткнувся на помилку, яка передбачала взаємодію між декількома пакетами. Для того, щоб повідомити про помилку, мені потрібно надати відтворюваний рецепт, що ілюструє проблему. Це вимагає завантаження відповідних пакетів, але нічого іншого від моєї програми init та інших пакунків. Який найкращий спосіб зробити це?

ОНОВЛЕННЯ

Для уточнення я знайомий з концепцією просіювання моїх .emacs у двійковому пошуку для виявлення коду, що викликає проблему. У цій ситуації я точно знаю, які пакунки вже викликають проблему. Я не знаю, як використовувати package-систему для завантаження лише цих кількох пакетів.

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


Якщо ви виділили проблему на обмежену кількість пакунків, ви можете спробувати відтворити проблему, починаючи з пустого .emacsфайлу - встановіть кожен пакет по одному, а потім подивіться, чи існує проблема. Ви можете здивувати себе і виявите пакунок відповідальним, що не грає добре з іншим пакетом. Після того, як ви пройшли далеко, напишіть кроки, якими ви скористалися для відтворення проблеми, і надішліть звіт про помилку - наприклад, починаючи з Emacs -Q , встановіть пакет A, потім встановіть пакет B, потім встановіть пакет C, потім відкрийте *Scratch*буфер і введіть ...
lawlist

Що сказав @lawlist. Якщо ви не впевнені, що ви повністю звузили речі, скористайтеся двійковим пошуком: видаліть довільну 1/2 того, що у вас є, що спростує проблему (наприклад, видаліть 2 pkgs з 4). Потім видаліть 3/4, 7/8, ... рубаючи код, необхідний для повторного повторного повторного повторного повторного введення кожного разу. Ви можете аналогічно нарізати код даного pkg в 1/2 тощо, щоб звузити речі до дуже невеликого шматочка коду, необхідного для його повторного спрощення. Ви можете скористатися командою, comment-regionщоб прокоментувати C-uобласть тексту або коментувати (або з нею коментувати ).
Дрю

Я розумію це на рівні псевдокоду. Я не розумію, як, використовуючи сімейство пакетів команд, ви завантажуєте лише підмножину пакетів у своєму. каталог emacs.d / elpa
Тайлер


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)

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для відтворення помилок

Однією з головних причин, яку я хотів написати, 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 ...аргументів, щоб завантажити інші необхідні пакети.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.