web-dev-qa-db-fra.com

Mise à jour des paquets dans Emacs

J'ai la configuration suivante pour les packages (je ne sais pas s'il existe une meilleure solution recommandée):

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

J'ai trois questions relatives à l'installation et à la mise à jour des packages.

Q1. Existe-t-il un moyen de mettre à jour la liste des packages disponibles (et les versions les plus récentes) et de mettre à jour un package spécifique?

Q.2 Quelle est la différence entre les sources de paquets suivantes ?:

  • EL PA,
  • GNU
  • confiture
  • melpa

Q. Est-ce que l'ordre dans lequel ils sont ajoutés à package-archives importe?

135
Amelio Vazquez-Reina
  1. Pour mettre à jour automatiquement la liste des packages, uniquement s'il n'y a pas déjà de liste de packages , utilisez les éléments suivants:

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

    Pour mettre à jour tous les packages installés, tapez package-list-packages, ce qui vous mènera au tampon *Packages* (et mettra également à jour la liste des packages), puis tapez U x.

    package-refresh-contents essaie inconditionnellement de télécharger une liste de paquets de tous les dépôts que vous avez ajoutés à package-archives; package-archive-contents n'est pas nul si vous avez déjà téléchargé la liste de paquets.

  2. ELPA est l'original. Je ne pense pas que ce soit vraiment maintenu, mais je ne suis pas sûr. Je ne l'utilise pas.

    GNU est "officiel". Il est maintenu avec Emacs, ce qui signifie que les choses devraient toujours fonctionner, mais les mises à jour et les nouveaux paquets ne viennent pas très souvent.

    Marmalade est fondamentalement un site Web sur lequel vous pouvez télécharger un package complet, qui sera ajouté au référentiel de marmalade. Vous ne soumettez pas simplement un lien vers le paquet en amont et cela n'automatise pas complètement la création du paquet. Je pense que c'est la bonne chose, parce que vous ne voulez pas nécessairement suivre en amont. Malheureusement, il n'a pas été maintenu pendant un certain temps, mais quelqu'un l'a récemment prise en charge. Il devrait donc être de retour et meilleur à un moment donné.

    Melpa prend une URL vers, par exemple. la zone LISP EmacsWiki ou un dépôt github, et construit automatiquement un paquet à partir de celui-ci. Ainsi, il a généralement au plus un jour de retard sur ce qu’il suit. Même si cela se produit en amont, je n’ai jamais eu de problème en pratique, et c’est d’où provient la plupart de mes paquets. Il y a aussi Melpa Stable , qui ressemble à Melpa mais récupère les révisions marquées du référentiel en amont au lieu de la dernière révision. Melpa stable a moins de paquets que Melpa.

    Le mode Org a son propre package.el repo ( http://orgmode.org/elpa/ ).

    Tous les dépôts de paquets fonctionnent de la même façon, il vous suffit de les ajouter à votre package-archives.

    Voici un article plus approfondi article de blog sur ce sujet, avec lequel je suis principalement d'accord.

  3. Je ne suis pas sûr, mais je pense que si un package est dupliqué dans différentes mises en pension, l'ordre dans lequel les mises en pension apparaissent dans package-archives détermine la priorité. Je ne sais pas si la priorité la plus élevée est au début ou à la fin de la liste.

    Mise à jour: Dans Emacs 25, il existe une variable package-archive-priorities que vous pouvez utiliser pour hiérarchiser vos mises en pension de paquets (par exemple, préférez ELPA à MELPA).


Voici la section pertinente de mon init.el, si cela vous intéresse:

(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))))
153
jpkotta

Dans Emacs, utilisez M-x list-packages pour lister tous les paquetages qui actualiseront automatiquement le contenu de l'archive. Ensuite, utilisez U pour marquer tous les packages pouvant être mis à niveau à mettre à niveau, et x pour effectuer les nouvelles mises à jour. Emacs va ensuite chercher et installer toutes les mises à jour, et vous demande ensuite de supprimer les anciennes versions obsolètes.

Vous voudrez peut-être aussi jeter un œil à Carton , qui fournit un moyen plus pratique de gérer vos packages en les déclarant dans un fichier dédié, et inclut un client pratique en ligne de commande permettant d'installer et de mettre à niveau automatiquement les packages déclarés dans par ici.


L'ordre de package-archives importe pas . Emacs regroupe le contenu de toutes les archives dans une seule liste cohérente des paquetages disponibles et de leurs versions, stockée dans package-archive-contents.

Sur package-install, Emacs choisira simplement la version la plus récente d'un paquet, quelle que soit l'archive d'origine. Pour plus de contrôle sur le paquet Origin, MELPA fournit le paquet melpa qui permet d’afficher une liste noire ou blanche des paquets provenant d’archives spécifiées.

91
lunaryorn

En terminal:

emacs

M-x list-packages

cela vous met dans le * packages * buffer

shift-u x

emacs vous le demandera (y/n), attendez les mises à jour

C-x k <ret>

cela supprimera le tampon * packages * et vous ramènera à * scratch *

C-x-C-c

cela quittera emacs et vous permettra de relancer via, mais vous devrez peut-être déboguer :(

emacs

mes 2 ¢

20
rezwits

Ceci est plus un commentaire étendu sur la réponse de JPKOTA.

C'est un ajustement que je teste pour la réponse de jpkotta ci-dessus:

(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

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

La liste de paquets ne rafraîchissait pas assez souvent pour mon cas d'utilisation.

Je n'ai pas envisagé la possibilité d'une solution plus efficace à mon problème. D'abord, je dois voir si le problème disparaît avec cet ajustement.

2
Brady Trainor