Bagaimana cara menggunakan versi lokal dari sebuah paket di spacemacs?

8

Ini mirip dengan pertanyaan ini tetapi jawaban di sana tampaknya sudah usang.

Katakanlah saya menggunakan layer dan ingin meretas kode dari paket tertentu yang digunakan layer. Bagaimana saya melakukannya?


Untuk menggambarkan dengan lebih baik apa yang ingin saya capai secara umum, saya berikan contoh spesifik.

Saya mencoba untuk mendapatkan spotifylapisan untuk bekerja, tetapi mastercabang saat ini dalam helm-spotifypaket menggunakan API web yang sudah usang. Ada permintaan tarik untuk memperbaikinya dan saya ingin mencobanya dan mungkin berkontribusi sesuatu. Masalah saya adalah, saya tidak bisa mendapatkan salinan lokal helm-spotifyuntuk memuat.

Apa yang saya coba adalah beralih ke developcabang spacemacs:

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

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

Saya berubah dari

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

Untuk

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

Dan menarik helm-spotifyrepositori ke~/.emacs.d/layers/spotify/local/helm-spotify

Ketika saya me-restart spacemacs saya dapatkan

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

Ketika saya melihat helm-spotify.elada:

(require 'multi)

Jadi dugaan saya adalah, bahwa ketika menginstal helm-spotifydari melpadependensi multiakan diselesaikan sebelum memuat helm-spotifytetapi tentu saja tidak lagi ketika saya menggunakan salinan lokal helm-spotify.

Jadi pertanyaan saya adalah :

  • Bagaimana mengatasi dependensi saat menggunakan paket lokal?
  • Atau haruskah saya melakukan ini sama sekali berbeda dari apa yang saya jelaskan?

Saya juga mencoba, tidak berhasil, untuk menambahkan multike dotspacemacs-additional-packagesdan 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))))

di packages.el. Juga mencoba tanpa menambahkan multike dotspacemacs-additional-packages.

Dimitri Schachmann
sumber
AFAIK tidak ada cara untuk menyelesaikan dependensi secara otomatis ketika menggunakan paket lokal, karena package.el(modul Emacs bawaan) tidak benar-benar melihat local/helm-spotifysebagai sebuah paket. Cara mengatasinya secara manual, dan Anda berada di arah yang benar. Bisakah Anda menambahkan lebih detail bagaimana Anda mencoba menambahkan multi? Tidak jelas apakah Anda menambahkannya ke additional-packagesdan spotify-packagespada saat yang sama, atau mencobanya secara terpisah. Memiliki multidi spotify-packagesdan spotify/init-multifungsi dalam packages.el(tanpa menggunakan additional-packages) harus cukup
bmag
Juga, jika Anda ingin menguji permintaan tarik tanpa mengedit kode secara lokal, Anda dapat menggunakan recipebukan local. misalnya(helm-spotify :location (recipe <recipe specs>))
bmag
Aku hanya mencoba tanpa menambahkan multiuntuk dotspacemacs-additional-packagestanpa keberhasilan. Kesalahannya sama. Saya memperbarui pertanyaan saya untuk mencerminkan packages.elsaya menggunakan. Terima kasih atas usaha Anda!
Dimitri Schachmann
Saya pikir Anda menemukan bug, karena saya mencoba apa yang saya pikir seharusnya berhasil dan saya mendapatkan kesalahan yang sama. Sudah terlambat di sini jadi saya tidak bisa menggali lebih dalam sekarang, tetapi sementara itu Anda bisa mencoba menggunakan recipedaripada local(itu harus mengurus multi-dependensi untuk Anda), atau memindahkan multikonfigurasi ke lapisan yang terpisah dan memastikan lapisan itu terdaftar sebelumnya spotifydalam dotspacemacs-configuration-layers(daftar lapisan)
bmag

Jawaban:

10

Pertama, Anda tidak boleh memodifikasi kode di cabang master, Spacemacs dirancang agar dapat diretas sambil menjaga cabang master hanya-baca, juga bukan karena dorongan yang mendorong ke cabang master mungkin terjadi !. Jika Anda benar-benar ingin memodifikasi kode, Anda harus menggunakan cabang pengembangan dan tetap memperbaruinya secara manual. Mengembangkan cabang tidak pernah dipaksa mendorong.

EDIT: sebenarnya Anda menggunakan cabang pengembangan, permintaan maaf saya, saya membiarkan paragraf untuk referensi.

Sekarang jawabannya :-) Cara yang benar untuk melakukan apa yang Anda inginkan adalah menimpa lokasi di dotspacemacs-additional-packages. Saya baru saja mencobanya dengan forking helm-spotifydi namespace saya dan kemudian menambahkan:

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

Kemudian setelah restart Spacemacs mengambil paket dari fork saya dengan benar alih-alih mencapai MELPA. Spacemacs digunakan quelpauntuk mengambil repositori dari GitHub berdasarkan resep MELPA, package.eldigunakan untuk menginstal paket sehingga dependensi diselesaikan dengan benar.

Perhatikan bahwa:

  • Anda mungkin harus secara manual menghapus helm-spotifyfolder dalam ˜/.emacs.d/elpadirektori dan me-restart Emacs.
  • Anda masih harus menambahkan spotifylayer ke dotspacemacs-configuration-layersvariabel Anda .
syl20bnr
sumber
3
Anda juga dapat menambahkan cabang ke resep::branch "my-branch"
syl20bnr
Ini bekerja dengan sempurna! Terima kasih banyak!
Dimitri Schachmann
Maaf jika saya lambat untuk memahami, tapi bisakah seseorang tolong jelaskan ini adalah bentuk bodoh? Jadi saya menggunakan paket XYZ , yang saat ini diinstal secara otomatis oleh Spacemacs dari Melpa. Apa sebenarnya langkah-langkah yang perlu diambil untuk mengalihkan paket ini ke versi lokal? (Atau satu di repo Github milik saya, jika itu perlu; tetapi terus terang itu akan sangat mengganggu untuk debugging perubahan apa pun.) File konfigurasi Spacemacs apa yang perlu diubah, dan dengan cara apa?
leftaroundtentang
Atau buat direktori dengan nama paket di .emacs.d/private/localdirektori, dan tambahkan direktori itu ke variabel path-load dengan menambahkan (some-package :location local)ke daftar dotspacemacs-additional-packagesdi dalam dotspacemacs/layersfungsi file dotspacemacs Anda. Setelah menempatkan file paket Anda ke dalam direktori-paket ini file dapat dimuat, tanpa memerlukan path lengkap, dengan menempatkan (require 'package-name)di dalam tubuh dotspacemacs/user-configfungsi file dotspacemacs Anda. - dari spacemacs doc
Didier A.