164 votes

Mise à jour des paquets dans Emacs

J'ai la configuration suivante pour les paquets (je ne sais pas s'il existe une meilleure configuration 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 paquets.

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

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

  • ELPA,
  • GNU
  • marmelade
  • melpa

Q.3 L'ordre dans lequel ils sont ajoutés a-t-il une importance ? package-archives ?

0 votes

Utilisez-vous le M-x package-list-packages ? Elle montre tous les paquets disponibles et leur version la plus récente. Vous pouvez également effectuer une installation à partir de cette interface.

14 votes

MELPA est nécessaire pour l'auto-complétion puisque personne n'a pris la peine de rendre l'auto-complétion disponible sur Marmalade. Ne vous inquiétez pas, mais nettoyez plutôt votre package-archives . Débarrassez-vous de l'archive ELPA, qui n'est plus maintenue, et de l'archive marmalade, qui est un fouillis de paquets périmés et dupliqués sans directives claires ni maintenance. Utilisez uniquement l'archive standard GNU et MELPA>.

2 votes

Merci @lunaryorn ! C'est très utile. Savez-vous comment je pourrais rester informé de ce genre de choses ? (c'est-à-dire les "bonnes choses à savoir" comme celles-ci au fur et à mesure de l'évolution d'Emacs)

177voto

jpkotta Points 2025
  1. Afin de mettre à jour automatiquement la liste des paquets, seulement s'il n'y a pas déjà une liste de paquets utilisez ce qui suit :

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

    Afin de mettre à jour tous les paquets installés, tapez package-list-packages qui vous amènera au *Packages* (et également mettre à jour la liste des paquets), puis tapez U x .

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

  2. ELPA est l'original. Je pense qu'il n'est plus vraiment entretenu, mais je n'en suis pas sûr. Je ne l'utilise pas.

    GNU est "officiel". Il est maintenu en même temps qu'Emacs, ce qui signifie que les choses devraient toujours fonctionner, mais les mises à jour et les nouveaux paquets ne sont pas très fréquents.

    Marmelade est essentiellement un site web où vous pouvez télécharger un paquet complet, et il sera ajouté au repo de marmalade. Vous ne soumettez pas simplement un lien vers l'amont du paquet, 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 l'amont. Malheureusement, il n'a pas été maintenu pendant un certain temps, mais quelqu'un l'a récemment repris, il devrait donc être de retour et amélioré à un moment donné.

    Melpa prend une URL vers, par exemple, la zone lisp d'EmacsWiki ou un dépôt github, et construit automatiquement un paquet à partir de celui-ci. Ainsi, il a généralement au maximum un jour de retard sur ce qu'il suit. Bien qu'il suive en amont, je n'ai jamais eu de problème en pratique, et c'est de là que proviennent la plupart de mes paquets. Il y a aussi Étable Melpa Melpa stable, qui est comme Melpa mais qui prend les révisions marquées du dépôt amont au lieu de la dernière révision. Melpa stable a moins de paquets que Melpa.

    Mode Org a sa propre package.el repo ( http://orgmode.org/elpa/ ).

    Tous les dépôts de paquets fonctionnent de la même manière, vous les ajoutez simplement à votre package-archives .

    Voici un article plus approfondi article de blog sur ce sujet, que je partage en grande partie.

  3. Je ne suis pas sûr, mais je pense que si un paquet est dupliqué dans différents dépôts, l'ordre dans lequel les dépôts apparaissent dans le fichier package-archives détermine la préséance. Je ne sais pas si la préséance est au début ou à la fin de la liste.

    Mise à jour : Dans Emacs 25, il y a une variable package-archive-priorities que vous pouvez utiliser pour donner la priorité à vos dépôts de paquets (par exemple, préférer ELPA à MELPA).


Voici la section pertinente de mon init.el si vous êtes intéressé :

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

2 votes

Merci ! Que fait when (not package-archive-contents) vérifier ?

3 votes

Le conditionnel empêche le rafraîchissement à chaque fois que je démarre emacs (je ne veux généralement qu'il vérifie que lorsque je le lui demande). Elle ne vérifie que s'il n'y a pas d'archives de paquets, ce qui ne devrait être le cas que la première fois que je clone ma configuration sur une nouvelle machine.

0 votes

Je vous informe simplement de la réponse de @Brandy Trainor, qui semble compléter votre réponse - au cas où elle serait utile.

117voto

lunaryorn Points 13621

Dans Emacs, utilisez M-x list-packages pour lister tous les paquets, ce qui rafraîchira automatiquement le contenu de l'archive. Ensuite, utilisez U pour marquer tous les paquets à mettre à niveau, et x pour effectuer les nouvelles mises à jour. Emacs récupérera et installera alors toutes les mises à jour, et vous demandera ensuite si vous souhaitez supprimer les anciennes versions obsolètes.

Vous pouvez également jeter un coup d'œil à Carton qui fournit un moyen plus pratique de gérer vos paquets en les déclarant dans un fichier dédié, et inclut un client de ligne de commande pratique pour installer et mettre à jour automatiquement les paquets déclarés de cette manière.


L'ordre de package-archives fait no matière. Emacs agrège le contenu de toutes les archives en une seule liste cohérente des paquets disponibles et de leurs versions, stockée dans le fichier 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 l'origine des paquets, MELPA fournit la commande paquet melpa qui permet de mettre sur liste noire ou blanche les paquets des archives spécifiées.

5 votes

C'est S-u pour être plus précis.

0 votes

@mcb Quel est S-u ? Le menu du paquet n'utilise pas cette liaison.

2 votes

Je veux dire Shift-u par cela.

39voto

rezwits Points 675

En terminal :

emacs

M-x list-packages

cela vous place dans le tampon *packages*.

shift-u x

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

C-x k <ret>

ceci tuera le tampon *packages* et vous ramènera à *scratch*.

C-x-C-c

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

emacs

mon 2¢

2voto

Brady Trainor Points 299

Il s'agit plutôt d'un commentaire étendu sur la réponse de jpkotta.

C'est un ajustement que j'expérimente 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

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

La liste des paquets n'était pas rafraîchie assez souvent pour mon cas d'utilisation.

Je n'ai pas considéré s'il y avait une solution plus efficace à mon problème ; d'abord, je dois voir si le problème disparaît avec cet ajustement.

0 votes

Dans ma réponse, package-archive-contents est rafraîchie uniquement si elle n'existe pas. L'idée est que vous copiez votre .emacs.d sur une nouvelle machine et qu'il installe automatiquement tous vos paquets, mais après cela vous devez mettre à jour manuellement. J'essaie de mettre à jour environ une fois toutes les deux semaines. Je suppose que vous avez ajouté un paquet à votre liste, mais votre fichier package-archive-contents était trop vieux pour l'avoir ?

0 votes

@jpkotta, j'ai un double démarrage, chacun utilisant sa valeur par défaut. ~/.emacs.d/elpa/ pour l'emplacement des colis. Cependant, ma version de votre code d'installation de paquets est dans une "troisième" partition, ( e:/emacs-config o /e/emacs-config/ ). Ainsi, j'ajoute un paquet à la liste alors que je suis dans un système d'exploitation, et elle devrait être mise à jour lorsque je charge Emacs dans l'autre système d'exploitation. Il est certain que ma solution est un peu exagérée, mais elle semble au moins fonctionner.

0 votes

@jpkotta, pourquoi mon package-archive-contents semble être si détraquée m'échappe. C'est un problème que je n'ai pas résolu. Si je cherche et trouve une solution "plus élégante" à l'avenir, je l'ajouterai à mon message.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X