¿Cómo usar una versión local de un paquete en spacemacs?

8

Esto es similar a esta pregunta, pero la respuesta allí parece estar en desuso.

Digamos que estoy usando una capa y quiero hackear el código de un paquete en particular que está usando esa capa. ¿Cómo lo hago?


Para ilustrar mejor lo que quiero lograr en general, presento un ejemplo específico.

Intento que la spotifycapa funcione, pero la masterrama actual del helm-spotifypaquete usa una API web en desuso. Hay una solicitud de extracción para solucionar esto y quiero probarlo y tal vez contribuir con algo. Mi problema es que no puedo obtener la copia local helm-spotifypara cargar.

Lo que intenté fue cambiar a la developrama de spacemacs:

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

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

Cambié de

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

A

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

Y sacó el helm-spotifyrepositorio a~/.emacs.d/layers/spotify/local/helm-spotify

Cuando reinicio los spacemacs me sale

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

En cuando miro helm-spotify.elhay:

(require 'multi)

Entonces, supongo que cuando se instala helm-spotifydesde melpala dependencia multise resuelve antes de cargar, helm-spotifypero, por supuesto, ya no cuando uso una copia local de helm-spotify.

Entonces mis preguntas son :

  • ¿Cómo se resuelven las dependencias cuando se usa un paquete local?
  • ¿O debería hacer esto completamente diferente de lo que describí?

También intenté, sin éxito, para agregar multia dotspacemacs-additional-packagesy para 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))))

en packages.el. También intentado sin agregar multia dotspacemacs-additional-packages.

Dimitri Schachmann
fuente
AFAIK no hay una forma de resolver automáticamente las dependencias cuando se usan paquetes locales, ya que package.el(el módulo Emacs incorporado) realmente no se ve local/helm-spotifycomo un paquete. La forma de resolverlo es manualmente, y está en la dirección correcta. ¿Puedes agregar más detalles sobre cómo intentaste agregar multi? No está claro si lo agregó additional-packagesy spotify-packagesal mismo tiempo, o si los probó por separado. Tener multien spotify-packagesy una spotify/init-multifunción en packages.el(sin usar additional-packages) debe ser lo suficientemente
BMAG
Además, si desea probar una solicitud de extracción sin editar su código localmente, puede usarla en recipelugar de local. Por ejemplo(helm-spotify :location (recipe <recipe specs>))
bmag
Acabo de intentar sin añadir multia dotspacemacs-additional-packagessin éxito. El error es el mismo. Actualicé mi pregunta para reflejar lo packages.elque estoy usando. ¡Gracias por tu esfuerzo!
Dimitri Schachmann
Creo que encontraste un error, porque intenté lo que pensé que debería funcionar y obtuve el mismo error. Es tarde aquí, así que no puedo profundizar en este momento, pero mientras tanto puedes intentar usar en recipelugar de local(debería encargarse de la dependencia múltiple para ti) o mover la multiconfiguración a una capa separada y asegurarte de que esa capa aparece antes spotifyen dotspacemacs-configuration-layers(la lista de capas)
bmag

Respuestas:

10

En primer lugar, nunca debe modificar el código en la rama maestra, Spacemacs está diseñado para ser pirateable mientras se mantiene la rama maestra de solo lectura, ¡y no es posible que se produzcan empujes forzados a la rama maestra! Si realmente desea modificar el código, debe usar la rama de desarrollo y mantenerlo actualizado manualmente. Desarrollar rama nunca es forzado empuje.

EDITAR: en realidad estabas usando la rama de desarrollo, mis disculpas, dejé el párrafo como referencia.

Ahora la respuesta :-) La forma correcta de hacer lo que quiere es sobrescribir la ubicación dotspacemacs-additional-packages. Simplemente lo intenté bifurcando helm-spotifyen mi espacio de nombres y luego agregué:

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

Luego, al reiniciar, Spacemacs tomó el paquete de mi bifurcación correctamente en lugar de llegar a MELPA. Spacemacs utiliza quelpapara buscar repositorios de GitHub basados ​​en recetas MELPA, package.else utiliza para instalar los paquetes para que las dependencias se resuelvan correctamente.

Tenga en cuenta que:

  • Puede que tenga que eliminar manualmente la helm-spotifycarpeta en el ˜/.emacs.d/elpadirectorio y reiniciar Emacs.
  • Todavía tiene que agregar la spotifycapa a su dotspacemacs-configuration-layersvariable.
syl20bnr
fuente
3
También puede agregar una rama a la receta::branch "my-branch"
syl20bnr
Esto funcionó perfectamente! ¡Muchas gracias!
Dimitri Schachmann
Lo siento si tardo en comprenderlo, pero ¿podría alguien explicarme que es una forma estúpida? Así que estoy usando el paquete XYZ , actualmente instalado automáticamente por Spacemacs de Melpa. ¿Cuáles son exactamente los pasos que deben seguirse para cambiar este paquete a una versión local? (O uno en un repositorio de Github mío, si es necesario; pero, francamente, sería bastante molesto para la depuración de cualquier cambio). ¿Qué archivos de configuración de Spacemacs deben ajustarse y de qué manera?
Leftaroundabout
Alternativamente, cree un directorio con el nombre del paquete en el .emacs.d/private/localdirectorio y agregue ese directorio a la variable de ruta de carga agregando (some-package :location local)a la lista dotspacemacs-additional-packagesdentro de la dotspacemacs/layersfunción de su archivo dotspacemacs. Después de colocar su archivo de paquete en este directorio de paquetes, el archivo se puede cargar, sin requerir la ruta completa, colocando (require 'package-name)dentro del cuerpo de la dotspacemacs/user-configfunción de su archivo dotspacemacs. - de spacemacs doc
Didier A.