Comment charger uniquement un sous-ensemble de packages installés

13

J'ai rencontré un bogue qui impliquait une interaction entre plusieurs packages. Afin de signaler le bogue, je dois fournir une recette reproductible illustrant le problème. Cela nécessite le chargement des packages appropriés, mais rien d'autre depuis mon init, et aucun autre package. Quelle est la meilleure façon de procéder?

MISE À JOUR

Pour clarifier, je connais le concept de passer au crible mon .emacs dans une recherche binaire pour identifier le code à l'origine d'un problème. Dans cette situation, je sais exactement quels packages sont déjà à l'origine du problème. Ce que je ne sais pas, c'est comment utiliser le package-système pour charger uniquement ces quelques paquets.

(package-initialize)chargera les packages, mais aussi tout le reste dans mon .emacs.d/elparépertoire. package-load-listme permet de spécifier des versions particulières de packages à charger, ou des packages particuliers à exclure explicitement . J'ai besoin de l'inverse - comment fournir à Emacs une liste de packages à inclure , sans charger d'autres packages dans le système elpa / package.

Tyler
la source
Si vous avez isolé le problème à un nombre fini de packages, vous pouvez essayer de reproduire le problème en commençant à partir d'un .emacsfichier vierge - installez chaque package un par un et voyez si le problème persiste. Vous pouvez vous surprendre et trouver le package responsable qui ne joue pas bien avec l'autre package. Lorsque vous êtes allé aussi loin que possible, notez les étapes que vous avez utilisées pour reproduire le problème et soumettre le rapport de bogue - par exemple, à partir d' Emacs -Q , installez le package A, puis installez le package B, puis installez le package C, puis ouvrez le *Scratch*tampon et tapez ...
lawlist
Ce que @lawlist a dit. Si vous n'êtes pas sûr d'avoir complètement réduit les choses, utilisez la recherche binaire: supprimez une moitié arbitraire de ce que vous avez qui reproche le problème (par exemple, supprimez 2 paquets sur 4). Ensuite, supprimez 3/4, 7/8, ... en coupant le code nécessaire pour le reprocher en deux à chaque fois. Vous pouvez également couper le code d'un paquet donné en 1/2, etc., pour réduire les choses à un très petit morceau de code nécessaire pour le reproduire. Vous pouvez utiliser la commande comment-regionpour mettre en commentaire (ou, avec C-u, pour décommenter) une région de texte.
Drew
Je comprends cela au niveau d'un pseudo-code. Je ne comprends pas comment, en utilisant la famille de commandes package, vous ne chargez qu'un sous-ensemble des packages dans votre. Répertoire emacs.d / elpa
Tyler
Auparavant, un responsable a indiqué que je chargeais tout avec package-initialize, et je ne sais pas comment éviter cela github.com/emacs-ess/ESS/issues/140
Tyler
1
package-load-list est un moyen d'inclure explicitement des packages, il suffit de supprimer le allsymbole.
npostavs

Réponses:

10

La package-load-listvariable peut être utilisée pour spécifier précisément les packages et les versions à charger:

List of packages for `package-initialize' to load.
Each element in this list should be a list (NAME VERSION), or the
symbol `all'.  The symbol `all' says to load the latest installed
versions of all packages not specified by other elements.

For an element (NAME VERSION), NAME is a package name (a symbol).
VERSION should be t, a string, or nil.
If VERSION is t, the most recent version is activated.
If VERSION is a string, only that version is ever loaded.
 Any other version, even if newer, is silently ignored.
 Hence, the package is "held" at that version.
If VERSION is nil, the package is not loaded (it is "disabled").

La seule chose à surveiller est que la valeur par défaut inclut all, si vous setqle faites, tout ira bien car cela écrase complètement la valeur d'origine.

(require 'package)
(setq package-load-list
      '((package1 "4.2")
        (package2 "0.5.1")))
(package-initialize)
npostavs
la source
4

Une option qui fonctionnerait bien dans des contextes où les développeurs travaillant sur la reproduction du bogue peuvent ne pas avoir (ou ne pas vouloir) que ces dépendances soient installées consiste à utiliser le trypackage ( https://melpa.org/#/try ). D'autres peuvent charger des packages à partir de la gestion des packages sans modifier leur installation locale.

(package-install 'try)
(require 'try)

(try 'some-package)
(try 'some-other-package)

(steps (to reproduce) (the (problem)))
ebpa
la source
2

Ce cas d'utilisation est une terrible lacune de package.el, alors ne l'utilisez pas package.el. À la place, utilisez un gestionnaire de packages comme straight.el(je suis l'auteur), spécialement conçu pour prendre en charge ce cas d'utilisation.

Pour une documentation détaillée sur straight.el, y compris des comparaisons avec d'autres gestionnaires de packages, consultez le fichier README . Ci-dessous, j'ai cité la section qui correspond à votre question.

Utilisation straight.elpour reproduire des bogues

L'une des principales raisons pour lesquelles je voulais écrire straight.elétait que les gestionnaires de paquets existants n'étaient pas bons pour reproduire les bogues. Par exemple, certains d'entre eux chargeraient tous les packages installés lors de l'initialisation du gestionnaire de packages! De toute évidence, ce n'est pas acceptable pour un "cas de test minimal".

Au contraire, le bootstrap straight.elne charge rien d'autre que straight.ellui-même (les référentiels de recettes par défaut sont enregistrés, mais pas clonés tant que cela n'est pas nécessaire). Vous devriez normalement charger straight.elau moyen de l' extrait de bootstrap , mais lorsque vous êtes dedans emacs -Q, voici comment vous pouvez initialiser straight.el:

M-x load-file RET ~/.emacs.d/straight/bootstrap.el RET

Vous pouvez également le faire à partir de la ligne de commande, peut-être en lui créant un alias:

$ emacs -Q -l ~/.emacs.d/straight/bootstrap.el

Disons que vous faites un rapport de bogue pour Projectile. Pour charger uniquement Projectile et toutes ses dépendances, exécutez:

M-x straight-use-package RET projectile RET

Notez que cela utilisera les révisions actuellement vérifiées de Projectile et toutes ses dépendances, vous devriez donc en prendre note afin de faire votre rapport de bogue.

Radon Rosborough
la source
0

Lorsque vous en avez besoin pour une seule fois (par exemple pour essayer de tester une recette pour reproduire un bug), vous pouvez souvent vous en tirer avec:

emacs -Q -l ~/.emacs.d/elpa/<pkg>-<vers>/<pkg>-autoloads.el

J'ai dit "souvent" car il ne prêtera pas attention aux dépendances, donc dans certains cas, vous devrez ajouter plus d' -l ...arguments pour charger les autres packages nécessaires.

Stefan
la source