Làm thế nào để sử dụng một phiên bản địa phương của một gói trong spacemacs?


8

Điều này tương tự với câu hỏi này nhưng câu trả lời dường như bị phản đối.

Giả sử tôi đang sử dụng một lớp và muốn hack mã của một gói cụ thể mà lớp đó đang sử dụng. Làm thế nào để tôi đi về nó?


Để minh họa rõ hơn những gì tôi muốn đạt được nói chung, tôi trình bày một ví dụ cụ thể.

Tôi cố gắng để spotifylớp hoạt động, nhưng masternhánh hiện tại trong helm-spotifygói sử dụng API web không dùng nữa. Có một yêu cầu kéo để sửa lỗi này và tôi muốn thử nó và có thể đóng góp một cái gì đó. Vấn đề của tôi là, tôi không thể helm-spotifytải bản sao cục bộ để tải.

Những gì tôi đã cố gắng là chuyển sang developchi nhánh của spacemacs:

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

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

Tôi đã thay đổi từ

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

Đến

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

Và kéo helm-spotifykho lưu trữ đến~/.emacs.d/layers/spotify/local/helm-spotify

Khi tôi khởi động lại spacemacs, tôi nhận được

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

Trong khi tôi nhìn vào helm-spotify.elđó là:

(require 'multi)

Vì vậy, dự đoán của tôi là, khi cài đặt helm-spotifytừ melpaphụ thuộc vào multiđược giải quyết trước khi tải helm-spotifynhưng tất nhiên không còn nữa khi tôi sử dụng bản sao cục bộ helm-spotify.

Vì vậy, câu hỏi của tôi là :

  • Làm thế nào để giải quyết các phụ thuộc khi sử dụng một gói địa phương?
  • Hay tôi nên làm điều này hoàn toàn khác với những gì tôi mô tả?

Tôi cũng đã cố gắng, nhưng không thành công, để thêm multivào dotspacemacs-additional-packagesvà để 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))))

trong packages.el. Cũng đã thử mà không cần thêm multivào dotspacemacs-additional-packages.


AFAIK không có cách nào để tự động giải quyết các phụ thuộc khi sử dụng các gói cục bộ, vì package.el(mô-đun Emacs tích hợp) không thực sự được xem local/helm-spotifylà một gói. Cách để giải quyết nó là thủ công và bạn đang đi đúng hướng. Bạn có thể thêm chi tiết cách bạn đã cố gắng để thêm multi? Không rõ nếu bạn thêm nó vào additional-packagesspotify-packagescùng một lúc, hoặc thử riêng chúng. Có multitrong spotify-packagesvà một spotify/init-multihàm trong packages.el(không sử dụng additional-packages) nên là đủ
bmag

Ngoài ra, nếu bạn muốn kiểm tra yêu cầu kéo mà không chỉnh sửa mã cục bộ, bạn có thể sử dụng recipethay vì local. ví dụ(helm-spotify :location (recipe <recipe specs>))
bmag

Tôi chỉ thử nó mà không thêm multivào dotspacemacs-additional-packagesmà không thành công. Lỗi là như nhau. Tôi đã cập nhật câu hỏi của mình để phản ánh việc packages.eltôi đang sử dụng. Cảm ơn nỗ lực của bạn!
Dimitri Schachmann

Tôi nghĩ rằng bạn đã tìm thấy một lỗi, bởi vì tôi đã thử những gì tôi nghĩ nên hoạt động và tôi đã gặp lỗi tương tự. Bây giờ đã muộn rồi nên tôi không thể đào sâu hơn ngay bây giờ, nhưng trong lúc này, bạn có thể thử sử dụng recipethay vì local(nó sẽ quan tâm đến sự phụ thuộc đa dạng cho bạn), hoặc chuyển multicấu hình sang một lớp riêng và đảm bảo rằng lớp đó được liệt kê trước spotifytrong dotspacemacs-configuration-layers(danh sách lớp)
bmag

Câu trả lời:


10

Đầu tiên, bạn không bao giờ nên sửa đổi mã trong nhánh chính, Spacemacs được thiết kế để có thể hack được trong khi giữ cho nhánh chính chỉ đọc, cũng không phải là lực đẩy đến nhánh chính có thể xảy ra!. Nếu bạn thực sự muốn sửa đổi mã, bạn nên sử dụng nhánh phát triển và cập nhật mã theo cách thủ công. Phát triển chi nhánh không bao giờ bị ép.

EDIT: thực sự bạn đang sử dụng nhánh phát triển, tôi xin lỗi, tôi để đoạn văn để tham khảo.

Bây giờ câu trả lời :-) Cách chính xác để làm những gì bạn muốn là ghi đè lên vị trí dotspacemacs-additional-packages. Tôi chỉ thử nó bằng cách chuyển helm-spotifyvào không gian tên của mình và sau đó thêm vào:

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

Sau đó, khi khởi động lại, Spacemac đã lấy gói từ nĩa của tôi một cách chính xác thay vì đến MELPA. Spacemacs sử dụng quelpađể tìm nạp các kho từ GitHub dựa trên các công thức nấu ăn MELPA, package.elđược sử dụng để cài đặt các gói để các phụ thuộc được giải quyết chính xác.

Lưu ý rằng:

  • bạn có thể phải xóa thủ công helm-spotifythư mục trong thư mục ˜/.emacs.d/elpavà khởi động lại Emacs.
  • Bạn vẫn phải thêm spotifylớp vào dotspacemacs-configuration-layersbiến của bạn .

3
Bạn cũng có thể thêm một nhánh vào công thức::branch "my-branch"
syl20bnr

Điều này làm việc hoàn hảo! Cảm ơn bạn rất nhiều!
Dimitri Schachmann 23/2/2016

Xin lỗi nếu tôi chậm nắm bắt, nhưng ai đó có thể vui lòng giải thích đây là một hình thức ngu ngốc không? Vì vậy, tôi đang sử dụng gói XYZ , hiện được cài đặt tự động bởi Spacemacs từ Melpa. Chính xác các bước cần thực hiện để chuyển gói này sang phiên bản cục bộ là gì? (Hoặc một trong một repo Github của tôi, nếu cần thiết, nhưng thật lòng mà nói, nó sẽ khá khó chịu khi gỡ lỗi cho bất kỳ thay đổi nào.) Tập tin cấu hình Spacemacs cần được điều chỉnh, và theo cách nào?
rẽ trái

Hoặc tạo một thư mục có tên của gói trong .emacs.d/private/localthư mục và thêm thư mục đó vào biến đường dẫn tải bằng cách thêm (some-package :location local)vào danh sách dotspacemacs-additional-packagestrong dotspacemacs/layerschức năng của tệp dotspacemacs của bạn. Sau khi đặt tệp gói của bạn vào thư mục gói này, tệp có thể được tải, mà không yêu cầu đường dẫn đầy đủ, bằng cách đặt một (require 'package-name)bên trong phần thân của dotspacemacs/user-configchức năng của tệp dotspacemacs của bạn. - từ tài liệu spacemacs
Didier A.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.