Wie verwende ich eine lokale Version eines Pakets in Spacemacs?

8

Dies ähnelt dieser Frage, aber die Antwort dort scheint veraltet zu sein.

Angenommen, ich verwende eine Ebene und möchte den Code eines bestimmten Pakets hacken, das diese Ebene verwendet. Wie gehe ich vor?


Um besser zu veranschaulichen, was ich im Allgemeinen erreichen möchte, präsentiere ich ein konkretes Beispiel.

Ich versuche, die spotifyEbene zum Laufen zu bringen , aber der aktuelle masterZweig im helm-spotifyPaket verwendet eine veraltete Web-API. Es gibt eine Pull-Anfrage , um dies zu beheben, und ich möchte es versuchen und vielleicht etwas beitragen. Mein Problem ist, dass ich die lokale Kopie nicht helm-spotifyzum Laden bekommen kann.

Ich habe versucht, in den developZweig von spacemacs:

git branch --track develop origin/develop
git checkout develop

Im ~/.emacs.d/layers/spotify/packages.el

Ich habe mich verändert von

(setq spotify-packages '(spotify helm-spotify))

Zu

(setq spotify-packages
          '(    
                spotify
                (helm-spotify :location local)
           ))

Und zog das helm-spotifyRepository zu~/.emacs.d/layers/spotify/local/helm-spotify

Wenn ich Spacemacs neu starte, bekomme ich

File error: Cannot open load file, no such file or directory, multi

Wenn ich hineinschaue, helm-spotify.elgibt es:

(require 'multi)

Meine Vermutung ist also, dass bei der Installation helm-spotifyaus melpader Abhängigkeit von multivor dem Laden aufgelöst wird, helm-spotifyaber natürlich nicht mehr, wenn ich eine lokale Kopie von verwende helm-spotify.

Meine Fragen sind also :

  • Wie können Abhängigkeiten bei Verwendung eines lokalen Pakets aufgelöst werden?
  • Oder sollte ich das ganz anders machen als ich es beschrieben habe?

Ich habe auch versucht, ohne Erfolg, hinzufügen multizu dotspacemacs-additional-packagesund zu spotify-packages:

(setq spotify-packages '(
                         multi ;; I added this
                         spotify
                         (helm-spotify :location local) ;; I modified here
                         ))

;; I added this
(defun spotify/init-multi ()
  (use-package multi))

;; the rest is as it was

(defun spotify/init-spotify ()
  (use-package spotify
    :config (spacemacs/set-leader-keys
              "amsp" 'spotify-playpause
              "amsn" 'spotify-next
              "amsN" 'spotify-previous
              "amsQ" 'spotify-quit)))

(when (configuration-layer/layer-usedp 'spacemacs-helm)
  (defun spotify/init-helm-spotify ()
    (use-package helm-spotify
      :config (spacemacs/set-leader-keys
                "amsg" 'helm-spotify))))

in packages.el. Auch versucht ohne Zugabe multizu dotspacemacs-additional-packages.

Dimitri Schachmann
quelle
AFAIK Es gibt keine Möglichkeit, Abhängigkeiten bei der Verwendung lokaler Pakete automatisch aufzulösen, da package.el(das integrierte Emacs-Modul) nicht wirklich local/helm-spotifyals Paket angezeigt wird. Die Lösung erfolgt manuell, und Sie befinden sich in der richtigen Richtung. Können Sie näher erläutern, wie Sie versucht haben, etwas hinzuzufügen multi? Es ist nicht klar, ob Sie es zu additional-packagesund spotify-packagesgleichzeitig hinzugefügt oder separat ausprobiert haben. Nachdem multiin spotify-packagesund eine spotify/init-multiFunktion in packages.el(ohne Verwendung additional-packages) sollte ausreichen
BMAG
Wenn Sie eine Pull-Anforderung testen möchten, ohne ihren Code lokal zu bearbeiten, können Sie recipestattdessen anstelle von verwenden local. zB(helm-spotify :location (recipe <recipe specs>))
bmag
Ich habe es einfach versucht, ohne etwas hinzuzufügen multi, dotspacemacs-additional-packagesohne Erfolg. Der Fehler ist der gleiche. Ich habe meine Frage aktualisiert, um die von packages.elmir verwendete Frage wiederzugeben . Danke für deinen Einsatz!
Dimitri Schachmann
Ich denke, Sie haben einen Fehler gefunden, weil ich versucht habe, was meiner Meinung nach funktionieren sollte, und den gleichen Fehler erhalten habe. Es ist spät hier, also kann ich momentan nicht tiefer graben, aber in der Zwischenzeit können Sie entweder versuchen, es recipeanstelle von zu verwenden local(es sollte die Mehrfachabhängigkeit für Sie berücksichtigen), oder die multiKonfiguration auf eine separate Ebene verschieben und diese Ebene sicherstellen ist zuvor spotifyin dotspacemacs-configuration-layers(der
Ebenenliste

Antworten:

10

Erstens sollten Sie den Code in der Hauptverzweigung niemals ändern. Spacemacs ist so konzipiert, dass es hackbar ist, während die Hauptverzweigung schreibgeschützt bleibt. Außerdem kann es nicht zu Force-Pushs in der Hauptverzweigung kommen! Wenn Sie den Code wirklich ändern möchten, sollten Sie den Entwicklungszweig verwenden und ihn manuell auf dem neuesten Stand halten. Entwicklungszweig wird niemals erzwungen.

EDIT: Eigentlich haben Sie den Entwicklungszweig verwendet, ich entschuldige mich, ich lasse den Absatz als Referenz.

Jetzt die Antwort :-) Der richtige Weg, um das zu tun, was Sie wollen, besteht darin, den Ort in zu überschreiben dotspacemacs-additional-packages. Ich habe es einfach versucht, indem ich helm-spotifymeinen Namespace eingegeben und dann hinzugefügt habe:

   dotspacemacs-additional-packages
     '((helm-spotify :location (recipe :fetcher github :repo "syl20bnr/helm-spotify")))

Dann holte Spacemacs beim Neustart das Paket korrekt von meiner Gabel, anstatt MELPA zu erreichen. Spacemacs verwendet quelpazum Abrufen von Repositorys von GitHub basierend auf MELPA-Rezepten und package.elwird zum Installieren der Pakete verwendet, damit Abhängigkeiten korrekt aufgelöst werden.

Beachten Sie, dass:

  • Möglicherweise müssen Sie den helm-spotifyOrdner im ˜/.emacs.d/elpaVerzeichnis manuell löschen und Emacs neu starten.
  • Sie müssen die spotifyEbene noch zu Ihrer dotspacemacs-configuration-layersVariablen hinzufügen .
syl20bnr
quelle
3
Sie können dem Rezept auch einen Zweig hinzufügen::branch "my-branch"
Syl20bnr
Das hat perfekt funktioniert! Vielen Dank!
Dimitri Schachmann
Tut mir leid, wenn ich langsam begreife, aber könnte jemand bitte erklären, dass dies eine dumme Form ist? Ich verwende also das Paket XYZ , das derzeit automatisch von Spacemacs von Melpa installiert wird. Welche Schritte müssen genau unternommen werden, um dieses Paket auf eine lokale Version umzustellen? (Oder eines auf einem Github-Repo von mir, wenn das nötig ist; aber ehrlich gesagt wäre es ziemlich ärgerlich, wenn Änderungen debuggt werden.) Welche Spacemacs-Konfigurationsdateien müssen auf welche Weise optimiert werden?
links um den
Alternativ können Sie ein Verzeichnis mit dem Namen des Pakets im .emacs.d/private/localVerzeichnis erstellen und dieses Verzeichnis zur Ladepfadvariablen hinzufügen (some-package :location local), indem Sie es dotspacemacs-additional-packagesinnerhalb der dotspacemacs/layersFunktion Ihrer dotspacemacs-Datei zur Liste hinzufügen. Nachdem Sie Ihre Paketdatei in dieses Paketverzeichnis gestellt haben, kann die Datei geladen werden, ohne dass der vollständige Pfad erforderlich ist, indem Sie eine (require 'package-name)in den Hauptteil der dotspacemacs/user-configFunktion Ihrer dotspacemacs-Datei einfügen. - von spacemacs doc
Didier A.