Comment utiliser une version locale d'un package dans spacemacs?

8

Ceci est similaire à cette question, mais la réponse semble être obsolète.

Disons que j'utilise une couche et que je veux pirater le code d'un package particulier que cette couche utilise. Comment dois-je procéder?


Pour mieux illustrer ce que je veux accomplir en général, je présente un exemple spécifique.

J'essaie de faire fonctionner la spotifycouche, mais la masterbranche actuelle du helm-spotifypackage utilise une API Web obsolète. Il y a une demande de pull pour résoudre ce problème et je veux l'essayer et peut-être contribuer quelque chose. Mon problème est que je ne parviens pas helm-spotifyà charger la copie locale de .

J'ai essayé de passer à la developbranche de spacemacs:

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

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

J'ai changé de

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

À

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

Et tiré le helm-spotifyréférentiel vers~/.emacs.d/layers/spotify/local/helm-spotify

Lorsque je redémarre les spacemacs, je reçois

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

Quand je regarde, helm-spotify.elil y a:

(require 'multi)

Donc, je suppose que lors de l'installation à helm-spotifypartir de melpala dépendance, le multiproblème est résolu avant le chargement, helm-spotifymais bien sûr plus lorsque j'utilise une copie locale de helm-spotify.

Mes questions sont donc :

  • Comment résoudre les dépendances lors de l'utilisation d'un package local?
  • Ou dois-je faire cela complètement différemment de ce que j'ai décrit?

J'ai également essayé, sans succès, d'ajouter multià dotspacemacs-additional-packageset à 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))))

dans packages.el. A également essayé sans ajouter multià dotspacemacs-additional-packages.

Dimitri Schachmann
la source
AFAIK il n'y a pas de moyen de résoudre automatiquement les dépendances lors de l'utilisation de packages locaux, car package.el(le module Emacs intégré) n'est pas vraiment considéré local/helm-spotifycomme un package. La façon de le résoudre est manuellement et vous êtes dans la bonne direction. Pouvez-vous ajouter plus de détails sur la façon dont vous avez essayé d'ajouter multi? Il n'est pas clair si vous l'avez ajouté additional-packageset spotify-packagesen même temps, ou si vous les avez essayés séparément. Avoir multidans spotify-packageset une spotify/init-multifonction packages.el(sans utiliser additional-packages) devrait être suffisant
Bmag
De plus, si vous souhaitez tester une demande d'extraction sans modifier son code localement, vous pouvez utiliser à la recipeplace de local. par exemple(helm-spotify :location (recipe <recipe specs>))
bmag
Je viens d' essayer sans ajouter multià dotspacemacs-additional-packagessans succès. L'erreur est la même. J'ai mis à jour ma question pour refléter celle que packages.elj'utilise. Merci pour votre effort!
Dimitri Schachmann
Je pense que vous avez trouvé un bug, car j'ai essayé ce que je pensais fonctionner et j'ai eu la même erreur. Il est tard ici, donc je ne peux pas creuser plus profondément pour le moment, mais en attendant, vous pouvez soit essayer d'utiliser à la recipeplace de local(cela devrait prendre en charge la multi-dépendance pour vous), soit déplacer la multiconfiguration vers un calque séparé et vous assurer que ce calque est répertorié avant spotifydans dotspacemacs-configuration-layers(la liste des calques)
bmag

Réponses:

10

Tout d'abord, vous ne devez jamais modifier le code dans la branche principale, Spacemacs est conçu pour être piratable tout en gardant la branche principale en lecture seule, et non pas que des poussées forcées vers la branche principale puissent se produire!. Si vous voulez vraiment modifier le code, vous devez utiliser la branche develop et la maintenir à jour manuellement. Développer la branche n'est jamais forcé.

EDIT: en fait, vous utilisiez la branche de développement, mes excuses, je laisse le paragraphe pour référence.

Maintenant, la réponse :-) La bonne façon de faire ce que vous voulez est d'écraser l'emplacement dotspacemacs-additional-packages. Je viens de l'essayer en bifurquant helm-spotifydans mon espace de noms, puis j'ai ajouté:

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

Ensuite, au redémarrage, Spacemacs a récupéré correctement le package de ma fourchette au lieu d'atteindre MELPA. Spacemacs utilise quelpapour récupérer les référentiels de GitHub sur la base des recettes MELPA, package.elest utilisé pour installer les packages afin que les dépendances soient correctement résolues.

Notez que:

  • vous devrez peut-être supprimer manuellement le helm-spotifydossier dans le ˜/.emacs.d/elparépertoire et redémarrer Emacs.
  • Vous devez encore ajouter le spotifycalque à votre dotspacemacs-configuration-layersvariable.
syl20bnr
la source
3
Vous pouvez également ajouter une branche à la recette::branch "my-branch"
syl20bnr
Cela a parfaitement fonctionné! Merci beaucoup!
Dimitri Schachmann
Désolé si je suis lent à saisir, mais quelqu'un pourrait-il expliquer s'il s'agit d'une forme stupide? J'utilise donc le package XYZ , actuellement installé automatiquement par Spacemacs de Melpa. Quelles sont exactement les étapes à suivre pour basculer ce package vers une version locale? (Ou l'un sur un dépôt Github, si cela est nécessaire; mais franchement, ce serait assez ennuyeux pour le débogage de toute modification.) Quels fichiers de configuration de Spacemacs doivent être modifiés, et de quelle manière?
leftaroundabout
Vous pouvez également créer un répertoire avec le nom du package dans le .emacs.d/private/localrépertoire et ajouter ce répertoire à la variable de chemin de chargement en l'ajoutant (some-package :location local)à la liste dotspacemacs-additional-packagesdans la dotspacemacs/layersfonction de votre fichier dotspacemacs. Après avoir placé votre fichier de package dans ce répertoire de package, le fichier peut être chargé, sans nécessiter le chemin complet, en plaçant un (require 'package-name)dans le corps de la dotspacemacs/user-configfonction de votre fichier dotspacemacs. - du document spacemacs
Didier A.