So laden Sie nur eine Teilmenge der installierten Pakete

13

Ich bin auf einen Fehler gestoßen, der eine Interaktion zwischen mehreren Paketen beinhaltete. Um den Fehler zu melden, muss ich ein reproduzierbares Rezept bereitstellen, das das Problem veranschaulicht. Dies erfordert das Laden der entsprechenden Pakete, aber nichts anderes von meinem init und keine anderen Pakete. Wie geht das am besten?

AKTUALISIEREN

Zur Verdeutlichung bin ich mit dem Konzept vertraut, meine .emacs bei einer binären Suche zu durchsuchen, um den Code zu identifizieren, der ein Problem verursacht. In dieser Situation weiß ich genau, welche Pakete das Problem bereits verursachen. Was ich nicht weiß, ist, wie man das package-System benutzt, um nur diese wenigen Pakete zu laden.

(package-initialize)werde die pakete laden, aber auch alles andere in meinem verzeichnis .emacs.d/elpa. package-load-listHiermit kann ich bestimmte Versionen von Paketen angeben, die geladen werden sollen, oder bestimmte Pakete, die explizit ausgeschlossen werden sollen . Ich brauche das Gegenteil - wie Emacs mit einer Liste von Paketen zu liefern zu schließen , ohne im elpa / Paketsystems alle anderen Pakete geladen werden .

Tyler
quelle
Wenn Sie das Problem auf eine begrenzte Anzahl von Paketen beschränkt haben, können Sie versuchen, das Problem zu reproduzieren, indem Sie von einer leeren .emacsDatei aus beginnen. Installieren Sie jedes Paket einzeln und prüfen Sie, ob das Problem weiterhin besteht. Sie können sich selbst überraschen und feststellen, dass das verantwortliche Paket nicht gut mit dem anderen Paket zusammenarbeitet. Wenn Sie so weit wie möglich weg, schreibt die Stufen , dass Sie das Problem zu reproduzieren , verwendet und den Fehlerbericht - zum Beispiel ausgehend von Emacs -Q , Paket A installiert, dann Paket B installieren, dann Paket C installieren, dann öffne den *Scratch*Puffer und
tippe
Was @lawlist gesagt hat. Wenn Sie sich nicht sicher sind, ob Sie die Suche vollständig eingegrenzt haben, verwenden Sie die binäre Suche: Entfernen Sie eine beliebige Hälfte von dem, was Sie haben, das das Problem wiedergibt (z. B. entfernen Sie 2 von 4 Paketen). Entfernen Sie dann 3/4, 7/8, ... und hacken Sie den Code, den Sie benötigen, um ihn jedes Mal in zwei Hälften zu wiederholen. Sie können den Code eines bestimmten Pakets auf ähnliche Weise in 1/2 usw. zerlegen, um die Dinge auf ein sehr kleines Stück Code zu beschränken, das für die Reproduktion benötigt wird. Mit dem Befehl können Sie einen Textbereich auskommentieren comment-region(oder mit C-ueinem Kommentar auskommentieren).
Drew
Ich verstehe das auf einer Pseudocode-Ebene. Ich verstehe nicht, wie Sie mit der Paketfamilie von Befehlen nur eine Teilmenge der Pakete in Ihrem laden. Verzeichnis emacs.d / elpa
Tyler
Früher ein Betreuer darauf hingewiesen , dass ich Laden alles mit Paket-initialize war, und ich bin nicht sicher , wie dies zu vermeiden github.com/emacs-ess/ESS/issues/140
Tyler
1
package-load-list ist eine Möglichkeit, Pakete explizit einzuschließen. Entfernen Sie einfach das allSymbol.
Npostavs

Antworten:

10

Das package-load-list Variablen kann genau angegeben werden, welche Pakete und Versionen geladen werden sollen:

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

Das Einzige, worauf Sie achten müssen, ist, dass der Standardwert Folgendes enthält all. Wenn Sie setqdies tun, ist dies in Ordnung, da der ursprüngliche Wert dadurch vollständig überschrieben wird.

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

Eine gute Option, wenn die Entwickler, die an der Reproduktion des Fehlers arbeiten, diese Abhängigkeiten möglicherweise noch nicht installiert haben (oder möchten), ist die Verwendung des tryPakets ( https://melpa.org/#/try ). Andere können Pakete aus der Paketverwaltung laden, ohne ihre lokale Installation zu ändern.

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

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

(steps (to reproduce) (the (problem)))
ebpa
quelle
2

Dieser Anwendungsfall ist ein schrecklicher Mangel von package.el, also nicht verwenden package.el. Verwenden Sie stattdessen einen Paketmanager wiestraight.el (Ich bin der Autor), der speziell für diesen Anwendungsfall entwickelt wurde.

Ausführliche Dokumentation straight.el, einschließlich Vergleiche mit anderen Paketmanagern, finden Sie in der README . Im Folgenden habe ich den Abschnitt zitiert, der für Ihre Frage relevant ist.

Verwenden straight.el, um Fehler zu reproduzieren

Einer der Hauptgründe, warum ich schreiben wollte, straight.elwar, dass vorhandene Paketmanager die Fehler nicht reproduzieren konnten. Beispielsweise würden einige von ihnen alle installierten Pakete laden, wenn der Paketmanager initialisiert wurde! Offensichtlich ist das für einen "minimalen Testfall" nicht akzeptabel.

Im Gegenteil, das Bootstrapping straight.ellädt nichts außer sich straight.elselbst (die Standard-Rezept-Repositorys werden registriert, aber erst bei Bedarf geklont). Normalerweise sollten Sie straight.elmit dem Bootstrap-Snippet laden. Wenn Sie sich jedoch in diesem befinden emacs -Q, können Sie Folgendes initialisieren straight.el:

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

Sie können dies auch über die Befehlszeile tun, indem Sie möglicherweise einen Alias ​​dafür erstellen:

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

Angenommen, Sie erstellen einen Fehlerbericht für Projectile. Führen Sie Folgendes aus, um nur Projectile und alle zugehörigen Abhängigkeiten zu laden:

M-x straight-use-package RET projectile RET

Beachten Sie, dass dabei die aktuell ausgecheckten Versionen von Projectile und alle zugehörigen Abhängigkeiten verwendet werden. Beachten Sie diese, um einen Fehlerbericht zu erstellen.

Radon Rosborough
quelle
0

Wenn Sie es für eine einmalige Aktion benötigen (z. B. um ein Rezept zu testen, um einen Fehler zu reproduzieren), können Sie häufig davonkommen mit:

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

Ich habe "oft" gesagt, weil es Abhängigkeiten nicht berücksichtigt. In einigen Fällen müssen Sie daher mehr dieser -l ...Argumente hinzufügen , um die anderen benötigten Pakete zu laden.

Stefan
quelle