Обновление пакетов в Emacs
У меня есть следующие настройки для пакетов (не уверен, если есть лучший рекомендуемый):
(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 В чем разница между следующими источниками пакетов?:
- ЭЛПА,
- GNU
- джем
- melpa
Q.3 Имеет ли значение порядок их добавления в package-archives
?
4 ответа
Чтобы автоматически обновлять список пакетов, только если список пакетов еще не существует, используйте следующее:
(when (not package-archive-contents) (package-refresh-contents))
Чтобы обновить все установленные пакеты, введите
package-list-packages
, который доставит вас к*Packages*
буфер (а также обновить список пакетов), а затем введите U x.package-refresh-contents
безоговорочно пытается загрузить список пакетов из всех репозиториев, которые вы добавили вpackage-archives
;package-archive-contents
не ноль, если вы уже скачали список пакетов.ELPA является оригиналом. Я не думаю, что это действительно поддерживается больше, но я не уверен. Я не использую это.
GNU является "официальным". Он поддерживается вместе с Emacs, что означает, что все должно работать всегда, но обновления и новые пакеты приходят не очень часто.
Мармелад - это, по сути, веб-сайт, на который можно загрузить полный пакет, и он будет добавлен в репозиторий мармелада. Вы не просто отправляете ссылку на апстрим пакета, и это не совсем автоматизирует создание пакета полностью. Я думаю, что это правильно, потому что вы не обязательно хотите отслеживать вверх по течению. К сожалению, он некоторое время не обслуживался, но кто-то недавно взял его на себя, так что в какой-то момент он должен вернуться и стать лучше.
Melpa берет URL, например, в область lisp EmacsWiki или в репозиторий github, и автоматически создает из него пакет. Таким образом, это обычно самое большее на один день позади того, что он отслеживает. Хотя он отслеживает апстрим, у меня никогда не было проблем на практике, и именно отсюда большинство моих пакетов. Есть также Melpa Stable, которая похожа на Melpa, но вместо последней ревизии захватывает помеченные ревизии вышестоящего репо. В стойле Melpa меньше пакетов, чем в Melpa.
Режим Org имеет свой
package.el
РЕПО ( http://orgmode.org/elpa/).Все репозитории работают одинаково, вы просто добавляете их в свой
package-archives
,Вот более подробный пост в блоге на эту тему, с которым я в основном согласен.
Я не уверен, но я думаю, что если пакет дублируется в разных репо, то порядок, в котором репо появляются в
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))))
В Emacs используйте M-x list-packages
перечислить все пакеты, которые будут автоматически обновлять содержимое архива. Потом использовать U
пометить все обновляемые пакеты для обновления, и x
на самом деле выполнять новые обновления. Затем Emacs загрузит и установит все обновления и спросит вас, нужно ли впоследствии удалять старые, устаревшие версии.
Возможно, вы также захотите взглянуть на Carton, который предоставляет более удобный способ управления вашими пакетами, объявляя их в выделенном файле, и включает удобный клиент командной строки для автоматической установки и обновления пакетов, объявленных таким образом.
Получатель чего-то package-archives
не имеет значения. Emacs объединяет содержимое всех архивов в единый согласованный список доступных пакетов и их версий, хранящихся в package-archive-contents
,
на package-install
Emacs просто выберет самую новую версию пакета, независимо от исходного архива. Для большего контроля над происхождением пакета MELPA предоставляет пакет melpa, который позволяет помещать в черный или белый список пакеты из указанных архивов.
В терминале:
emacs
M-x list-packages
это помещает вас в буфер * packages *
shift-u x
Emacs спросит вас (да / нет), ждите обновлений
C-x k <ret>
это убьет буфер * packages * и вернет вас обратно к * scratch *
C-x-C-c
это выйдет из emacs и позволит вам перезапустить через, но вам, возможно, придется отлаживать:(
emacs
мой 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))
).
Список пакетов обновлялся недостаточно часто для моего варианта использования.
Я не подумал, есть ли более эффективное решение моей проблемы; во-первых, я должен увидеть, исчезнет ли проблема с этой настройкой.