Come caricare solo un sottoinsieme di pacchetti installati


13

Mi sono imbattuto in un bug che comportava un'interazione tra diversi pacchetti. Per segnalare il bug, devo fornire una ricetta riproducibile che illustri il problema. Ciò richiede il caricamento dei pacchetti appropriati, ma nient'altro dal mio init e nessun altro pacchetto. Qual è il modo migliore per farlo?

AGGIORNARE

Per chiarire, ho familiarità con il concetto di setacciare i miei .emacs in una ricerca binaria per identificare il codice che causa un problema. In questa situazione, so esattamente quali pacchetti stanno già causando il problema. Quello che non so è come usare il package-sistema per caricare solo quei pochi pacchetti.

(package-initialize)caricherà i pacchetti, ma anche tutto il resto nella mia .emacs.d/elpadirectory. package-load-listmi permette di specificare particolari versioni di pacchetti da caricare o particolari pacchetti da escludere esplicitamente . Ho bisogno del contrario: come fornire a Emacs un elenco di pacchetti da includere , senza caricare altri pacchetti nel sistema elpa / package.


Se hai isolato il problema su un numero finito di pacchetti, puoi provare a riprodurre il problema partendo da un .emacsfile vuoto - installa ogni pacchetto uno per uno e poi vedi se il problema persiste. Potresti sorprenderti e trovare il pacchetto responsabile che non funziona bene con l'altro pacchetto. Quando sei andato il più lontano possibile, scrivi i passaggi che hai usato per riprodurre il problema e invia la segnalazione di bug - ad esempio, partendo da Emacs -Q , installa il pacchetto A, quindi installa il pacchetto B, quindi installa il pacchetto C, quindi apri il *Scratch*buffer e digita ...
elenco delle leggi

Cosa ha detto @lawlist. Se non sei sicuro di aver ristretto completamente le cose, usa la ricerca binaria: rimuovi un 1/2 arbitrario di ciò che hai che riprende il problema (es. Rimuovi 2 pkg su 4). Quindi rimuovere 3/4, 7/8, ... tagliando il codice necessario per riproporlo a metà ogni volta. Puoi anche tagliare il codice di un determinato pkg in 1/2, ecc., Per restringere le cose a un po 'di codice necessario per riproporlo. Puoi usare il comando comment-regionper commentare (o, con C-u, per rimuovere il commento) una regione di testo.
Ha

Lo capisco a livello di pseudo-codice. Non capisco come, usando la famiglia di comandi pacchetto, carichi solo un sottoinsieme dei pacchetti nel tuo. directory emacs.d / elpa
Tyler,

In precedenza un manutentore aveva indicato che stavo caricando tutto con l'inizializzazione del pacchetto e non sono sicuro di come evitare questo github.com/emacs-ess/ESS/issues/140
Tyler

1
package-load-list è un modo per includere esplicitamente i pacchetti, basta rimuovere il allsimbolo.
npostavs,

Risposte:


10

La package-load-listvariabile può essere utilizzata per specificare con precisione quali pacchetti e versioni caricare:

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

L'unica cosa a cui prestare attenzione è che il valore predefinito include all, se lo farai setqallora andrà bene perché questo sovrascrive completamente il valore originale.

(require 'package)
(setq package-load-list
      '((package1 "4.2")
        (package2 "0.5.1")))
(package-initialize)

4

Un'opzione che funzionerebbe bene in contesti in cui gli sviluppatori che lavorano alla riproduzione del bug potrebbero non avere (o desiderare) quelle dipendenze installate è usare il trypacchetto ( https://melpa.org/#/try ). Altri possono caricare un pacchetto dalla gestione dei pacchetti senza modificare la loro installazione locale.

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

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

(steps (to reproduce) (the (problem)))

2

Questo caso d'uso è una terribile carenza di package.el, quindi non usare package.el. Invece, usa un gestore di pacchetti comestraight.el (sono l'autore), che è stato specificamente progettato per supportare questo caso d'uso.

Per una documentazione dettagliata su straight.el, compresi i confronti con altri gestori di pacchetti, consultare il README . Di seguito, ho citato la sezione pertinente alla tua domanda.

Usando straight.elper riprodurre bug

Uno dei motivi principali che volevo scrivere straight.elera che i gestori di pacchetti esistenti non erano buoni per la riproduzione di bug. Ad esempio, alcuni di loro caricheranno tutti i pacchetti installati quando il gestore pacchetti verrà inizializzato! Ovviamente ciò non è accettabile per un "caso di test minimo".

Al contrario, il bootstrap straight.elnon carica nulla tranne che per straight.else stesso (i repository di ricette predefiniti sono registrati, ma non clonati fino a quando necessario). Normalmente dovresti caricare straight.eltramite lo snippet di bootstrap , ma quando sei dentro emacs -Q, ecco come puoi inizializzare straight.el:

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

Puoi anche farlo dalla riga di comando, magari creando un alias per esso:

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

Supponiamo che tu stia facendo una segnalazione di bug per Projectile. Per caricare solo Projectile e tutte le sue dipendenze, eseguire:

M-x straight-use-package RET projectile RET

Si noti che questo utilizzerà le revisioni attualmente estratte di Projectile e di tutte le sue dipendenze, quindi è necessario prenderne nota per effettuare la segnalazione dei bug.


0

Quando ne hai bisogno per una tantum (ad esempio per provare e testare una ricetta per riprodurre un bug), puoi spesso cavartela con:

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

Ho detto "spesso" perché non presterà attenzione alle dipendenze, quindi in alcuni casi dovrai aggiungere più di questi -l ...argomenti per caricare gli altri pacchetti necessari.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.