Оновлення пакетів у Emacs


144

У мене є така установка для пакетів (не впевнений, чи є кращий рекомендований):

(require 'package)
(setq package-archives '(("ELPA" . "http://tromey.com/elpa/") 
                          ("gnu" . "http://elpa.gnu.org/packages/")
                          ("marmalade" . "http://marmalade-repo.org/packages/")))

; Apparently needed for the package auto-complete (why?)
(add-to-list 'package-archives
             '("melpa" . "http://melpa.milkbox.net/packages/") t)

(package-initialize)
(setq url-http-attempt-keepalives nil)

У мене є три питання, пов’язані з встановленням та оновленням пакетів.

Q1. Чи є спосіб оновити список доступних пакетів (і останніх версій) та оновити конкретний пакет?

Q.2 Яка різниця між наступними джерелами пакету:

  • ELPA,
  • GNU
  • мармелад
  • мельпа

Q.3 Чи має значення порядок їх додавання package-archives?


13
MELPA необхідний для автоматичного завершення, оскільки, очевидно, ніхто не заважає зробити автоматичне завершення доступним на Marmalade. Не турбуйте, а швидше прибирайте своє package-archives. Позбавтеся від архіву ELPA, який вже не підтримується, і архіву мармеладу, який є безладом застарілих та дублюваних пакетів без чітких рекомендацій та обслуговування. Використовуйте лише стандартний архів GNU, а MELPA>
місячний

2
Дякую @lunaryorn! Це дуже корисно. Чи знаєте ви, як я міг бути в курсі подібних речей? (тобто "добрі речі, щоб знати", такі як Emacs розвивається)
Амеліо Васкес-Рейна

3
Інформація вільно розтікається в Інтернеті, просто вловлюйте її: слідкуйте за / emacs на Reddit, слідкуйте за блогами та щебетаннями відомих людей Emacs, таких як Нік Фер'єр, Божидар Бацов, Маґнар Свен, Джон Віглі та ін., Приєднуйтесь до #emacs на Freenode IRC, і багато іншого.
місячник

3
Ви повинні, (setq package-enable-at-startup nil)якщо збираєтесь телефонувати (package-initialize)собі.
філс

2
Спасибі @phils - навіщо це потрібно?
Амеліо Васкес-Рейна

Відповіді:


163
  1. Для автоматичного оновлення списку пакунків, лише якщо списку пакунків вже немає , використовуйте наступне:

    (when (not package-archive-contents)
        (package-refresh-contents))

    Щоб оновити всі встановлені пакети, введіть package-list-packages, який переведе вас до *Packages*буфера (а також оновить список пакетів), а потім введіть U x.

    package-refresh-contentsбезумовно намагається завантажити список пакетів з усіх репостів, до яких ви додали package-archives; package-archive-contentsне стоїть на нулі, якщо ви вже завантажили список пакунків.

  2. ELPA - оригінал. Я не думаю, що це вже справді підтримується, але я не впевнений. Я не користуюся цим.

    GNU є "офіційним". Він підтримується разом з Emacs, а це означає, що все має працювати завжди, але оновлення та нові пакунки не надто часто бувають.

    Мармелад - це веб-сайт, на який ви можете завантажити повний пакет, і він буде доданий до репо-мармеладу. Ви не просто подаєте посилання на вихідний пакет, і це не зовсім автоматизує створення пакету. Я думаю, що це правильна річ, тому що вам не обов'язково хотіти відстежувати за течією. На жаль, воно деякий час не було збережене, але хтось нещодавно взяв його на озброєння, тому воно повинно повернутися і краще в якийсь момент.

    Melpa бере URL-адресу, наприклад, EmacsWiki lisp area або github repo і автоматично створює пакет з нього. Таким чином, він, як правило, щодня не відстає від того, що він відстежує. Хоча це простежується вище за течією, у мене ніколи не було проблем на практиці, і саме звідси береться більшість моїх пакетів. Є також Melpa Stable , яка схожа на Melpa, але захоплює теги до версії репо за течією замість останньої редакції. Мельпа конюшня має менше пакетів, ніж Мельпа.

    Режим Org має власне package.elрепо ( http://orgmode.org/elpa/ ).

    Усі репост пакету працюють однаково, ви просто додаєте їх до своїх package-archives.

    Ось більш поглиблена публікація в блозі на цю тему, з якою я здебільшого згоден.

  3. Я не впевнений, але я думаю, якщо пакет дублюється різними репостами, порядок, в якому вони з'являються, package-archivesвизначає пріоритет. Я не знаю, чи вище пріоритет є на початку чи в кінці списку.

    Оновлення: в Emacs 25 є змінна, package-archive-prioritiesяку ви можете використовувати для визначення пріоритетності репост ваших пакетів (наприклад, віддайте перевагу ELPA перед MELPA).


Ось відповідний розділ мого init.el, якщо вас цікавить:

(setq jpk-packages
      '(
        ac-dabbrev
        ...
        yasnippet
        ))

(package-initialize)
(add-to-list 'package-archives
             '("melpa" . "http://melpa.org/packages/"))
(add-to-list 'package-archives
             '("org" . "http://orgmode.org/elpa/"))

;; install any packages in jpk-packages, if they are not installed already
(let ((refreshed nil))
  (when (not package-archive-contents)
    (package-refresh-contents)
    (setq refreshed t))
  (dolist (pkg jpk-packages)
    (when (and (not (package-installed-p pkg))
             (assoc pkg package-archive-contents))
      (unless refreshed
        (package-refresh-contents)
        (setq refreshed t))
      (package-install pkg))))

(defun package-list-unaccounted-packages ()
  "Like `package-list-packages', but shows only the packages that
  are installed and are not in `jpk-packages'.  Useful for
  cleaning out unwanted packages."
  (interactive)
  (package-show-package-list
   (remove-if-not (lambda (x) (and (not (memq x jpk-packages))
                            (not (package-built-in-p x))
                            (package-installed-p x)))
                  (mapcar 'car package-archive-contents))))

2
Дякую! Що означає when (not package-archive-contents)перевірка?
Амеліо Васкес-Рейна

3
Умовно запобігає оновленню щоразу, коли я запускаю emacs (зазвичай я хочу, щоб це перевірив лише тоді, коли я їм це скажу). Він перевіряє, чи немає архівів пакетів, що повинно бути таким, коли я вперше клоную конфігурацію на нову машину.
jpkotta

Просто повідомте про відповідь @Brandy Trainor, яка, здається, доповнює вашу відповідь - якщо це корисно.
Амеліо Васкес-Рейна

Я думаю, що для цього потрібно (refresh-package-contents)беззастережно зателефонувати перед завантаженням нових пакетів, оскільки в іншому випадку Emacs може спробувати завантажити стару версію пакета (яка до цього часу є 404), вийти з ладу і припинити завантаження.
Володимир Пантелеев

Який найкращий спосіб зрозуміти, який пакет є небажаним? @jpkotta
Alper

103

У Emacs використовуйте M-x list-packagesдля переліку всіх пакетів, які автоматично оновлять вміст архіву. Потім використовуйте Uдля позначення всіх оновлених пакетів, які потрібно оновити, і xфактично виконувати нові оновлення. Потім Emacs отримає та встановить усі оновлення та попросить вас видаляти старі застарілі версії після цього.

Ви також можете поглянути на Carton, який надає більш зручний спосіб управління вашими пакунками, оголосивши їх у виділеному файлі, та включає зручний клієнт командного рядка для автоматичного встановлення та оновлення оголошених таким чином пакетів.


Порядок package-archivesне має значення. Emacs об'єднує вміст усіх архівів у єдиний цілісний список доступних пакетів та їх версій, що зберігаються в package-archive-contents.

Після цього package-installEmacs просто вибере останню версію пакету, незалежно від архіву, що виходить. Для більшого контролю над походженням пакету, MELPA надає пакет melpa, який дозволяє створювати чорний або білий список пакетів із зазначених архівів.


2
Це S-uякщо бути більш точним.
Ленар Хойт

@mcb Що S-u? У меню пакета це прив'язка не використовується.
місячник

2
Я маю Shift-uна увазі під цим.
Ленар Хойт

8
@mcb Ну, ось чому я написав столицю U lu
місячний рік

1
Тільки для заплутаних, як я, це думає, що це означає <kbd> U </kbd>.
Ленар Хойт

23

У терміналі:

emacs

M-x list-packages

це ставить вас у буфер * пакети *

shift-u x

emacs запитає вас (у / п), чекайте оновлень

C-x k <ret>

це знищить буфер * пакети * та поверне вас до * подряпини *

C-x-C-c

це вийде з emacs і дозволить вам перезапустити через, але, можливо, доведеться налагоджувати :(

emacs

мій 2 ¢


Коли я вводив "U", у мене не було вказано жодної команди або щось подібне. Після запуску M-x package-refresh-contentsце запропонувало мені ввести “U”, щоб позначити всі для оновлення, і тоді я зміг набрати “x” для запуску оновлень.
MrColes

2

Це більше розширений коментар до відповіді jpkotta.

Це коригування, з яким я експериментую для відповіді jpkotta вище:

(setq n 0)                                  ; set n as 0
(dolist (pkg pkgs-2b-present)               ; for each pkg in list
  (unless (or                               ; unless
           (package-installed-p pkg)        ; pkg is installed or
           (assoc pkg                       ; pkg is in the archive list
                  package-archive-contents))
    (setq n (+ n 1))))                      ; add one to n
(when (> n 0)                               ; if n > 0, 
  (package-refresh-contents))               ; refresh packages

(заміна (when (not package-archive-contents) (package-refresh-contents))).

Список пакунків не оновлювався достатньо часто для мого використання.

Я не розглядав, чи є більш ефективне рішення моєї проблеми; по-перше, я повинен побачити, чи проблема не вдається з цим коригуванням.


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

@jpkotta, у мене є подвійне завантаження, кожен з яких використовує за замовчуванням ~/.emacs.d/elpa/розташування пакетів. Однак моя версія вашого пакета установки-коду знаходиться у "третьому" розділі, ( e:/emacs-configабо /e/emacs-config/). Тому я додаю пакет до списку, перебуваючи в одній ОС, і він повинен оновлюватися, коли я завантажуюсь Emacsв іншій ОС. Напевно, в моєму рішенні є якийсь елемент надмірності, але він, здається, працює як мінімум.
Брейді Тренер

@jpkotta, чому моє, package-archive-contentsздавалося, могло бути таким, що не встигає мене втекти. Це питання, яке я не звужував. Якщо я шукаю і знайду «більш елегантне» рішення в майбутньому, я додам його до своєї посади.
Брейді Тренер

1
(package-refresh-contents)пише до ~/.emacs.d/elpa/archives. Незрозуміло, чи є у вас цей каталог спільним між ОС. Я б не рекомендував ділитися elpa/каталогами, тому що байт-код Emacs (код у байт- elpa/компіляції) не є сумісним назад ( gnu.org/software/emacs/manual/html_node/elisp/… ). Вам потрібно було б забезпечити, щоб обидві установки мали однакову версію Emacs. Я підтримую .emacs.dконтроль версій і синхронізую з цим різні установки.
jpkotta
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.