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

1019   4  

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

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

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


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

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

В терминала:

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

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

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

Comments

    Ничего не найдено.