Самый простой способ понизить версию пакета, установленного через MELPA

22

Иногда обновления пакетов из MELPA могут сломать некоторую часть emacs, и когда это произойдет, я бы хотел вернуться к использованию более старой версии пакета.

Прямо сейчас я могу сделать это двумя способами:

  • Я установил в emacs удаление файлов, перейдя в корзину, и когда я обновляю пакет, старая версия удаляется. Я могу получить старую версию и заменить одну в ~/.emacs.d/elpa.

  • Перейдите в репозиторий github пакета, который нарушил функциональность, извлеките более старую версию пакета, замените ту, которая была в ~/.emacs.d/elpagitub, перекомпилируйте файл (ы).

Оба эти способа включают в себя много ручной работы, которая перемещает вещи вокруг. Есть ли более простой (желательно автоматический) способ понизить версию пакетов, установленных из MELPA?

Чакраварти Рагхунандан
источник
4
Вы можете установить только последнюю версию через ELPA / package.el, Melpa и Melpa-stable даже не сохраняют старые версии пакетов. Чтобы установить пакет вручную, 1) загрузите исходный код 2) M-x package-install-file. Есть и другие способы управления пакетами, кроме ELPA / package.el, такие как el-get и quelpa , они могут использоваться без ELPA, возможно, они могут делать то, что вы хотите.
xuchunyang
2
Если вы не получили простого , работоспособного ответа на этот вопрос, пожалуйста, рассмотрите возможность отправки запроса на улучшение в Emacs: M-x report-emacs-bug(это также относится и к запросам на улучшение).
Дрю

Ответы:

9

Когда вы обновите свои пакеты через M-x list-packagesинтерфейс, после успешной установки пакета вам будет предложено удалить старый пакет. Не удаляйте их, чтобы они оставались на месте, и затем вы сможете позже удалить новый пакет через этот интерфейс.

Мой текущий список пакетов показывает 4 версии magit, установленные в моем каталоге ~ / .emacs.d / elpa /.

  magit              20160827.1549 obsolete              A Git porcelain inside Emacs
  magit              20160907.945  obsolete              A Git porcelain inside Emacs
  magit              20161001.1454 obsolete              A Git porcelain inside Emacs
  magit              20161123.617  installed             A Git porcelain inside Emacs

Позже вы можете очистить старые версии с помощью ключа ~(package-menu-mark-obsolete-for-deletion), чтобы отметить все устаревшие пакеты. Чтобы удалить определенную старую версию, перейдите к ее строке и нажмите, dчтобы отметить их для удаления. После того, как вы отметили пакеты, вы будете использовать их xдля выполнения действий как обычно.

В Emacs 25 пометка всех пакетов для Uфункциональности pgrade автоматически устанавливает все старые пакеты для удаления и не запрашивает подтверждения после установки. Вы должны искать строки, которые начинаются с заглавной буквы "D", которую вы можете просто снять (лучше всего с помощью следующего макроса)

Введите клавишу или аккорд слева от тире из следующих строк.

<F3>  - start macro recording
C-s   - isearch-forward
C-q   - quoted-insert
C-j   - linefeed character
D     - the mark at the start of the line
<Ret> - stops the isearch on the line with the "D"
u     - unmark the package for deletion
<F4>  - stops macro recording - the first package is now unmarked
<F4>  - executes the macro for the next upgraded package

Если больше нет совпадений для поиска, макрос позвонит в звонок и остановится, так что вы можете C-u 0 <F4>снять отметку со всех пакетов, отмеченных для удаления. После этого вы можете xвыполнить установку.

Функция, которую я объявил измененной в моем комментарии, должна быть изменена так, как я пока не могу понять, так как важно, чтобы последний (cond) блок был успешным, чтобы не выполнять бесконечный цикл.

p_wiersig
источник
О, эй, он не просит подтверждения удалить в моем emacs. Он просто удаляет старый пакет: / я думаю, что раньше спрашивал в emacs 24? я не помню
Чакраварти Рагхунандан
верно. Emacs 24 предлагает, 25, кажется, помечает старую для удаления, и это сработает при выполнении меток. Вы можете пометить пакеты для установки вручную или снять пометки с удалений или изменить (t (package-menu-mark-delete))строки package-menu--mark-upgrades-1таким образом, чтобы первая строка представляла собой тест для переменной конфигурации или что-то, что возвращается, nilесли вы не хотите немедленно удалять старые пакеты
p_wiersig
Не могли бы вы добавить соответствующие строки для редактирования в package.elисходный ответ, чтобы я мог принять ответ? Спасибо
Чакраварти Рагхунандан,
Конечно. Я заметил, что не могу заставить функцию делать то, что хочу, поэтому я объяснил, как снять отметку с помощью макроса.
p_wiersig
7

«Ядерный вариант» будет состоять в том, чтобы package.elполностью отказаться от него и вместо этого использовать менеджер пакетов, который я написал straight.el. Преимущество заключается в том, что straight.elпакеты устанавливаются путем клонирования их репозиториев Git, что упрощает использование любой версии, которую вы хотите. Кроме того, straight.elпредоставляет функциональные возможности для работы с ревизионными файлами блокировки, которые позволяют записывать точное состояние конфигурации управления пакетами до мельчайших деталей. Затем, в случае чрезвычайной ситуации, вы можете просто вернуть все пакеты к их заведомо исправным версиям.

Эти виды операций, в общем, невозможны package.el, и они всегда будут невозможны из-за общего дизайна.

В ответ на ваше желание избегать фиксации каждый раз, когда вы обновляете свои пакеты, это не обязательно с straight.el. Я бы порекомендовал написать файл блокировки версии и фиксировать его каждый раз, когда вы обновляете свои пакеты, так как это делает невозможным попадание в состояние, когда ваша конфигурация Emacs нарушается после обновления, и вы не знаете, как вернуться. Но вам не нужно этого делать, если вам нравится жить на грани.

Радон Росборо
источник
4

Я нахожу простой способ понижения: управление собственным архивом melpa.

  1. Клон Мелпа репо.
  2. Следуйте пользовательской вики-странице melpa, чтобы удалить все рецепты.
  3. Найдите коммит пакета, который вы хотите понизить, и создайте новый рецепт с этим коммитом для пакета. (см . readme от melpa о том, как указать коммит)
  4. Запустите, makeчтобы собрать пониженный пакет
  5. Добавьте в список свой собственный архив melpa, который может быть локальным каталогом package-archives.
  6. Установите более раннюю версию с помощью меню пакета. Или вы можете использовать package-pinned-packagesдля ограничения архива, откуда пакет должен быть загружен.
chunfengd
источник
3

Многие люди предпочитают не связывать пакеты ELPA с контролем версий, но это пример того, почему я считаю, что вы должны это делать.

Отменить что-либо тривиально, если все это совершено.

В зависимости от состояния вышестоящих пакетов ELPA существует риск.

Phils
источник
Но это означало бы, что я должен помнить о фиксации каждый раз, когда обновляю пакеты. Это не то, что я хочу. ИЛИ есть ли способ заставить emacs автоматически ставить и фиксировать обновленные пакеты всякий раз, когда я делаю обновление пакета?
Чакраварти Рагхунандан
1
Я не понимаю, почему вы не хотите, чтобы изменения в вашей конфигурации были преднамеренными решениями. Что касается автоматических коммитов, я уверен, что это может быть автоматизировано, но у меня нет решения для этого. Однако поиск таких решений может обеспечить продуктивность.
Филс