Обновление пакетов в 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 в чем разница между следующими источниками пакет?:

  • ELPA,
  • GNU
  • мармелад
  • melpa

Q. 3 имеет ли значение порядок, в котором они добавляются к package-archives?

4 ответов


  1. для автоматического обновления списка пакетов,только если нет списка пакетов уже использовать следующий:

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

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

    package-refresh-contents безоговорочно пытается загрузить список пакетов из репозиториев, которые вы добавили в package-archives; package-archive-contents не равен нулю, если вы уже загрузили список пакетов.

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

    GNU "официальный". Он поддерживается вместе с Emacs, что означает, что вещи всегда должны работать, но обновления и новые пакеты не приходят очень часто.

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

    Melpa принимает URL-адрес, например, EmacsWiki область lisp или репозиторий github и автоматически создает из нее пакет. Таким образом, он обычно не более чем на день отстает от того, что он отслеживает. Хотя он отслеживает вверх по течению, у меня никогда не было проблем на практике,и именно здесь большинство моих пакетов. Существует также Melpa Стабильный, что похоже на Melpa, но захватывает помеченные версии восходящего РЕПО вместо последней версии. Melpa stable имеет меньше пакетов, чем Melpa.

    Org mode есть своя package.el repo (http://orgmode.org/elpa/).

    все репозитории пакетов работают одинаково, вы просто добавляете их в свой package-archives.

    вот более глубокий блоге об этом предмете, с которым я в основном согласен.

  3. я не уверен, но я думаю, что если пакет дублируется в разных РЕПО, как РЕПО появляются в package-archives определяет приоритет. Я не знаю, есть ли более высокий приоритет в начало или конец списка.

    Update: в 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 затем получит и установит все обновления и спросит вас, следует ли удалить старые, устаревшие версии после этого.

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


приказом package-archives тут не вопрос. Emacs объединяет содержимое всех архивов в единый согласованный список доступных пакетов и их версий, хранящихся в package-archive-contents.

на package-install, Emacs просто выберет самую новую версию пакета, независимо от исходного архива. Для большего контроля над пакетом происхождения, MELPA предоставляет пакета melpa что позволяет Черно-или белый список пакетов из указанных архивов.


В терминала:

emacs

M-x list-packages

это помещает вас в буфер* packages*

shift-u x

emacs спросит вас (y/n), дождитесь обновлений

C-x k <ret>

это убьет буфер* packages *и вернет вас обратно в*scratch*

C-x-C-c

это выйдет из emacs и позволит вам перезапустить via, но вам, возможно, придется отлаживать: (

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

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

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