Como usar uma versão local de um pacote no spacemacs?

8

Isso é semelhante a essa pergunta, mas a resposta parece estar obsoleta.

Digamos que estou usando uma camada e queira hackear o código de um pacote específico que a camada está usando. Como proceder?


Para ilustrar melhor o que quero realizar em geral, apresento um exemplo específico.

Eu tento fazer com que a spotifycamada funcione, mas a masterramificação atual no helm-spotifypacote usa uma API da web obsoleta. Há uma solicitação de recebimento para corrigir isso e quero experimentá-lo e talvez contribuir com algo. Meu problema é que não consigo helm-spotifycarregar a cópia local do .

O que eu tentei foi mudar para o developramo de spacemacs:

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

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

Eu mudei de

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

Para

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

E puxou o helm-spotifyrepositório para~/.emacs.d/layers/spotify/local/helm-spotify

Quando reinicio o spacemacs, recebo

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

Quando eu olho, helm-spotify.elhá:

(require 'multi)

Então, meu palpite é que, ao instalar a helm-spotifypartir melpada dependência, o problema multié resolvido antes do carregamento, helm-spotifymas é claro que não quando mais uso uma cópia local do helm-spotify.

Então, minhas perguntas são :

  • Como resolver dependências ao usar um pacote local?
  • Ou devo fazer isso completamente diferente do que descrevi?

Eu também tentou, sem sucesso, para adicionar multia dotspacemacs-additional-packagese 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))))

no packages.el. Também tentei sem adicionar multia dotspacemacs-additional-packages.

Dimitri Schachmann
fonte
No AFAIK, não há como resolver automaticamente dependências ao usar pacotes locais, pois package.el(o módulo Emacs embutido) não é realmente visto local/helm-spotifycomo um pacote. A maneira de resolvê-lo é manualmente, e você está na direção certa. Você pode adicionar mais detalhes de como tentou adicionar multi? Não está claro se você o adicionou additional-packagese spotify-packagesao mesmo tempo ou se os tentou separadamente. Tendo multiem spotify-packagese uma spotify/init-multifunção em packages.el(sem usar additional-packages) deve ser suficiente
BMAG
Além disso, se você quiser testar uma solicitação pull sem editar seu código localmente, poderá usar em recipevez de local. por exemplo(helm-spotify :location (recipe <recipe specs>))
bmag 20/02
Eu apenas tentei isso sem adicionar multia dotspacemacs-additional-packagessem sucesso. O erro é o mesmo. Atualizei minha pergunta para refletir o packages.elque estou usando. Obrigado pelo seu esforço!
Dimitri Schachmann
Acho que você encontrou um bug, porque tentei o que achava que deveria funcionar e recebi o mesmo erro. É tarde aqui, então não posso ir mais fundo agora, mas, enquanto isso, você pode tentar usar em recipevez de local(isso deve cuidar da multi-dependência para você) ou mover a multiconfiguração para uma camada separada e garantir que essa camada está listado antes spotifyem dotspacemacs-configuration-layers(a lista camada)
BMAG

Respostas:

10

Primeiro, você nunca deve modificar o código na ramificação principal, o Spacemacs foi projetado para ser hackável enquanto mantém a ramificação principal somente leitura, também para que não ocorram impulsos de força na ramificação principal !. Se você realmente deseja modificar o código, use a ramificação de desenvolvimento e mantenha-a atualizada manualmente. A ramificação de desenvolvimento nunca é forçada.

EDIT: na verdade você estava usando o ramo de desenvolvimento, minhas desculpas, deixei o parágrafo como referência.

Agora a resposta :-) A maneira correta de fazer o que você deseja é substituir o local dotspacemacs-additional-packages. Eu apenas tentei bifurcando helm-spotifyno meu espaço para nome e adicionei:

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

Em seguida, ao reiniciar, o Spacemacs buscou o pacote do meu garfo corretamente, em vez de alcançar o MELPA. O Spacemacs usa quelpapara buscar repositórios do GitHub com base nas receitas MELPA, package.elé usado para instalar os pacotes para que as dependências sejam resolvidas corretamente.

Observe que:

  • pode ser necessário excluir manualmente a helm-spotifypasta no ˜/.emacs.d/elpadiretório e reiniciar o Emacs.
  • Você ainda precisa adicionar a spotifycamada à sua dotspacemacs-configuration-layersvariável.
syl20bnr
fonte
3
Você também pode adicionar um ramo à receita::branch "my-branch"
syl20bnr 23/02
Isso funcionou perfeitamente! Muito obrigado!
Dimitri Schachmann 23/02
Desculpe se estou com dificuldade de entender, mas alguém poderia explicar que essa é uma forma estúpida? Então, eu estou usando o pacote XYZ , atualmente instalado automaticamente pelo Spacemacs da Melpa. Quais são exatamente as etapas a serem tomadas para mudar este pacote para uma versão local? (Ou um em um repositório meu do Github, se for necessário; mas, francamente, seria bastante irritante para a depuração de qualquer alteração.) Quais arquivos de configuração do Spacemacs precisam ser aprimorados e de que maneira?
leftaroundabout
Como alternativa, crie um diretório com o nome do pacote no .emacs.d/private/localdiretório e inclua esse diretório na variável de caminho de carregamento adicionando (some-package :location local)à lista dotspacemacs-additional-packagesna dotspacemacs/layersfunção do seu arquivo dotspacemacs. Após colocar seu arquivo de pacote nesse diretório de pacotes, o arquivo pode ser carregado, sem exigir o caminho completo, colocando um (require 'package-name)dentro do corpo da dotspacemacs/user-configfunção do seu arquivo dotspacemacs. - from spacemacs doc
Didier A.