Обновление пакетов в 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 ответа

Решение
  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, например, в область lisp EmacsWiki или в репозиторий github, и автоматически создает из него пакет. Таким образом, это обычно самое большее на один день позади того, что он отслеживает. Хотя он отслеживает апстрим, у меня никогда не было проблем на практике, и именно отсюда большинство моих пакетов. Есть также Melpa Stable, которая похожа на Melpa, но вместо последней ревизии захватывает помеченные ревизии вышестоящего репо. В стойле Melpa меньше пакетов, чем в 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))))

В 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))).

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

Я не подумал, есть ли более эффективное решение моей проблемы; во-первых, я должен увидеть, исчезнет ли проблема с этой настройкой.

Другие вопросы по тегам