Come usare una versione locale di un pacchetto in spacemacs?


8

Questo è simile a questa domanda, ma la risposta sembra essere deprecata.

Diciamo che sto usando un layer e voglio hackerare il codice di un determinato pacchetto che layer sta usando. Come posso procedere?


Per illustrare meglio ciò che voglio realizzare in generale, presento un esempio specifico.

Provo a far funzionare il spotifylayer, ma il masterramo corrente nel helm-spotifypacchetto utilizza un'API Web obsoleta. C'è una richiesta pull per risolvere questo problema e voglio provarlo e forse contribuire con qualcosa. Il mio problema è che non riesco helm-spotifya caricare la copia locale di .

Quello che ho provato è stato di passare al developramo di spacemacs:

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

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

Sono cambiato da

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

Per

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

E ha portato il helm-spotifyrepository a~/.emacs.d/layers/spotify/local/helm-spotify

Quando riavvio i spacemacs ottengo

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

In quando guardo dentro helm-spotify.elc'è:

(require 'multi)

Quindi la mia ipotesi è che quando si installa helm-spotifydalla melpadipendenza su multiviene risolto prima del caricamento, helm-spotifyma ovviamente non più quando uso una copia locale di helm-spotify.

Quindi le mie domande sono :

  • Come risolvere le dipendenze quando si utilizza un pacchetto locale?
  • O dovrei farlo in modo completamente diverso da quello che ho descritto?

Ho anche provato, senza successo, di aggiungere multia dotspacemacs-additional-packagesed a 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. Anche provato senza aggiungere multia dotspacemacs-additional-packages.


AFAIK non esiste un modo per risolvere automaticamente le dipendenze quando si usano i pacchetti locali, dal momento che package.el(il modulo Emacs integrato) non vede davvero local/helm-spotifycome un pacchetto. Il modo per risolverlo è manualmente e sei nella giusta direzione. Puoi aggiungere maggiori dettagli come hai provato ad aggiungere multi? Non è chiaro se l'hai aggiunto a additional-packagese spotify-packagesallo stesso tempo, o se li hai provati separatamente. Avere multiin spotify-packagese una spotify/init-multifunzione in packages.el(senza usare additional-packages) dovrebbe essere sufficiente
bmag

Inoltre, se si desidera testare una richiesta pull senza modificarne il codice localmente, è possibile utilizzare recipeinvece di local. ad es.(helm-spotify :location (recipe <recipe specs>))
bmag

Ho appena provato senza l'aggiunta multidi dotspacemacs-additional-packagessenza successo. L'errore è lo stesso. Ho aggiornato la mia domanda per riflettere il packages.elche sto utilizzando. Grazie per i tuoi sforzi!
Dimitri Schachmann,

Penso che tu abbia trovato un bug, perché ho provato quello che pensavo dovesse funzionare e ho avuto lo stesso errore. È tardi, quindi non posso scavare più a fondo in questo momento, ma nel frattempo puoi provare a utilizzare recipeinvece di local(dovrebbe occuparti della multi dipendenza per te), oppure spostare la multiconfigurazione su un livello separato e assicurarti che quel livello è elencato prima spotifyin dotspacemacs-configuration-layers(la lista dei livelli)
bmag

Risposte:


10

Innanzitutto, non è mai necessario modificare il codice nel ramo principale, Spacemacs è progettato per essere hackerabile mantenendo il ramo principale in sola lettura, inoltre non possono verificarsi spinte forzate nel ramo principale !. Se vuoi davvero modificare il codice, dovresti usare il ramo di sviluppo e tenerlo aggiornato manualmente. Il ramo di sviluppo non è mai forzato.

EDIT: in realtà stavi usando il ramo di sviluppo, le mie scuse, ho lasciato il paragrafo come riferimento.

Ora la risposta :-) Il modo corretto di fare quello che vuoi è sovrascrivere la posizione dotspacemacs-additional-packages. L'ho appena provato biforcando helm-spotifynel mio spazio dei nomi e poi aggiunto:

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

Quindi al riavvio Spacemacs ha recuperato correttamente il pacchetto dal mio fork invece di raggiungere MELPA. Spacemacs utilizza quelpaper recuperare i repository da GitHub in base alle ricette MELPA, package.elviene utilizzato per installare i pacchetti in modo che le dipendenze vengano risolte correttamente.

Nota che:

  • potrebbe essere necessario eliminare manualmente la helm-spotifycartella nella ˜/.emacs.d/elpadirectory e riavviare Emacs.
  • Devi ancora aggiungere il spotifylivello alla tua dotspacemacs-configuration-layersvariabile.

3
Puoi anche aggiungere un ramo alla ricetta::branch "my-branch"
syl20bnr

Questo ha funzionato perfettamente! Grazie mille!
Dimitri Schachmann,

Scusa se sono lento a capire, ma qualcuno potrebbe spiegare che questa è una forma stupida? Quindi sto usando il pacchetto XYZ , attualmente installato automaticamente da Spacemacs di Melpa. Quali sono esattamente i passaggi che devono essere presi per passare questo pacchetto a una versione locale? (O uno su un mio repository Github, se è necessario; ma francamente sarebbe abbastanza fastidioso per il debug di eventuali modifiche.) Quali file di configurazione di Spacemacs devono essere modificati, e in che modo?
lasciato circa il

In alternativa, crea una directory con il nome del pacchetto nella .emacs.d/private/localdirectory e aggiungi quella directory alla variabile del percorso di caricamento aggiungendola (some-package :location local)all'elenco dotspacemacs-additional-packagesall'interno della dotspacemacs/layersfunzione del tuo file dotspacemacs. Dopo aver inserito il file del pacchetto in questa directory del pacchetto, è possibile caricare il file, senza richiedere il percorso completo, inserendo un elemento (require 'package-name)nel corpo della dotspacemacs/user-configfunzione del file dotspacemacs. - da spacemacs doc
Didier A.
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.