Làm thế nào tôi nên gói json với gói elisp của tôi?


7

Tôi muốn phân phối một gói elisp sử dụng json.el ( http://edward.oconnor.cx/2006/03/json.el ). Tôi cần điều này để làm việc cho các phiên bản emacs không được cài đặt sẵn json (chẳng hạn như OSX, được phát hành với emacs 22.1). Có cách nào được đề xuất cho tôi để gửi gói bên thứ ba như json với gói của tôi không?

Tôi sẽ được phân phối này dưới dạng nguồn trực tiếp cho khách hàng.


1
Nếu bạn đang hỗ trợ các phiên bản Emacs <23, tốt nhất không nên sử dụng thuật ngữ "gói" (ngụ ý ELPA). "Thư viện" là thuật ngữ bất khả tri hơn.
phils

2
Một tùy chọn sẽ là sử dụng locate-library- hoặc đơn giản là hành động khi (require 'json nil :noerror)thất bại - để xác định xem jsonđã có sẵn chưa và nếu không, hãy thêm thư mục con cho bản sao của chính bạn vào load-pathtrước khi nhập require.
phils

2
Tại sao bạn cần phải gửi json.elvới thư viện của bạn? Chỉ cần bao gồm (require 'json)và thêm một ghi chú trong Bình luận (bình luận tiêu đề tệp) cho người dùng biết nơi cần lấy json.el. Đó là lịch sự, đủ, và dễ dàng cho người dùng. Nếu thư viện của bạn không thực sự cần json.el , và nó chỉ là một đẹp-to-có hoặc là cần thiết chỉ cho một số chức năng (không phải tất cả), sau đó sử dụng (require 'json nil t)và thêm điều kiện trong mã của bạn mà kiểm tra cho sự hiện diện của nó (ví dụ featurephay fboundphay boundp). Bạn cũng có thể sử dụng (require 'json nil t)trong một định nghĩa hàm nhất định.
Drew

Emacs-22 dựng sẵn của OSX không chỉ cổ xưa, tôi nghe nói nó cũng bị tê liệt do thiếu hỗ trợ GUI, vì vậy tốt hơn hết bạn không nên sử dụng nó.
Stefan

Câu trả lời:


7

Như những người khác đã chỉ ra rằng nếu bạn đang nhắm mục tiêu Emacs 23 hoặc thậm chí 22 thì bạn không có gói Gói mà chỉ có một thư viện. Gói Gói không tồn tại trong Emacs trước Emacs 24 khi trình quản lý gói được thêm vào.

Đi kèm với một thư viện

Gói nó.

Vì không có cách tiêu chuẩn để cài đặt thư viện trước các gói, bạn có thể gói json.el vào bất cứ thứ gì bạn cung cấp cho người dùng của mình. Một số loại lưu trữ mà tôi đoán. Dù sao họ cũng sẽ phải cài đặt thủ công và do đó có thể chọn bất kỳ tệp nào họ cần: Chỉ thư viện của bạn cho người dùng Emacs 24/25, thư viện của bạn + json.el cho những người có phiên bản cũ hơn.

Miễn là bạn tài liệu này sẽ không gây rắc rối.

Gói với một gói

Đừng tuyệt đối không bó nó.

Tuy nhiên, nếu bạn xây dựng một gói thích hợp cho Emacs 24 trở lên, bạn không được bao gồmjson.el .

Người quản lý gói sẽ vui vẻ cài đặt bản sao đi kèm của bạn json.elcùng với thư viện thực tế của bạn. Vì các gói xuất hiện đầu tiên trong load-pathbản sao được đóng gói của json.elbạn sẽ ghi đè lên bản dựng sẵn, gây ra tất cả các loại rắc rối cho các gói mong đợi phiên bản mới hơn json.el.

Con đường để đi (theo ý kiến ​​của tôi)

Tạo hai bản phân phối gói của bạn:

  • Gói Emacs thích hợp cho Emacs 24 trở lên, ví dụ TAR với siêu dữ liệu gói tương ứng. Bạn thậm chí có thể lưu trữ một kho lưu trữ gói nhỏ với gói của mình để tự động phân phối các bản cập nhật cho người dùng Emacs 24.
  • Một tệp TAR với thư viện của bạn và json.el, nhưng không có siêu dữ liệu gói cho người dùng các phiên bản Emacs cũ hơn.

Điều duy nhất bạn cần để ý là khi người dùng các phiên bản Emacs cũ cập nhật lên Emacs 24. Trong trường hợp này, họ sẽ phải xóa cài đặt thư viện trước đó cùng với json.elvà cài đặt lại gói Emacs 24 thích hợp.

Một sự thay thế

Nếu bạn không muốn duy trì hai phân bố khác nhau mà bạn có thể bó json.el, nhưng dưới một cái tên khác nhau, ví dụ my-library-json-compat.el. Với một tên khác, bản sao gói của json.elbạn sẽ không bao giờ ghi đè lên bản dựng sẵn.

Vì các chức năng và ký hiệu trong bản sao được đóng gói vẫn xung đột với bản dựng sẵn, bạn phải cẩn thận không tải bản sao được đóng gói của mình khi thực json.elcó sẵn, nhưng điều này rất dễ:

(unless (require 'json nil 'no-error)
  (require 'json "my-library-json-compat"))

Emacs sẽ cố gắng tải json.elvà thất bại rơi trở lại bản sao được gói của bạn dưới một tên khác.

Con đường thực sự để đi (theo ý kiến ​​của tôi)

Nói với người dùng của bạn để cập nhật lên Emacs 24. Bản phát hành cuối cùng của Emacs 22 là tám (!) Năm trước, bản phát hành cuối cùng của Emacs 23 vẫn còn bốn năm trước. Cả hai phiên bản đều lỗi thời và thiếu nhiều tính năng, và nhiều gói (ví dụ Magit) hiện chỉ hỗ trợ Emacs 24. Emacs 22/23 là một ngõ cụt và không có cách nào từ họ.

Cập nhật lên Emacs 24 là đủ dễ dàng: Hầu hết các bản phân phối Linux hiện đại bao gồm ít nhất Emacs 24.1 trong kho lưu trữ gói của chúng. Đối với các gói Ứng dụng dựng sẵn OS X có sẵn và Emacs 24 ổn định mới nhất được bao gồm trong trình quản lý gói OS X phổ biến Homebrew.

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.