Wie soll ich json mit meinem elisp-Paket bündeln?


7

Ich möchte ein elisp-Paket verteilen, das json.el verwendet ( http://edward.oconnor.cx/2006/03/json.el ). Ich brauche dies, um für Versionen von Emacs zu funktionieren, auf denen json nicht vorinstalliert ist (z. B. OSX, das mit Emacs 22.1 geliefert wird). Gibt es eine empfohlene Möglichkeit für mich, ein Paket eines Drittanbieters wie json mit meinem Paket zu versenden?

Ich werde dies in Quellform direkt an Kunden verteilen.


1
Wenn Sie Emacs-Versionen <23 unterstützen, verwenden Sie wahrscheinlich am besten nicht den Begriff "Paket" (was ELPA impliziert). "Bibliothek" ist der agnostischere Begriff.
Phils

2
Eine Möglichkeit wäre, zu verwenden locate-library- oder einfach wirkt auf (require 'json nil :noerror)Fehler - zu prüfen , ob jsonbereits vorhanden ist , und wenn nicht, das Unterverzeichnis für Ihre eigene Kopie addieren , load-pathbevor requirees ing.
Phils

2
Warum müssen Sie json.elmit Ihrer Bibliothek versenden? Fügen Sie einfach (require 'json)einen Hinweis in den Kommentar ein und fügen Sie ihn hinzu (Dateikopfkommentare), der den Benutzern mitteilt, wo sie ihn erhalten können json.el. Das ist höflich, ausreichend und für die Benutzer einfach. Wenn Ihre Bibliothek nicht wirklich benötigt json.el wird und nur eine nette Sache ist oder nur für einige Funktionen (nicht alle) benötigt wird, verwenden (require 'json nil t)Sie in Ihrem Code Bedingungen, die auf ihre Anwesenheit prüfen (z . B. featurepoder fboundpoder boundp) , und fügen Sie sie hinzu . Sie können auch (require 'json nil t)in einer bestimmten Funktionsdefinition verwenden.
Drew

Der in OSX integrierte Emacs-22 ist nicht nur uralt, ich höre auch, dass er durch die mangelnde GUI-Unterstützung beeinträchtigt wird. Sie sollten ihn also besser nicht verwenden.
Stefan

Antworten:


7

Wie andere bereits betont haben, haben Sie kein "Paket", sondern nur eine Bibliothek, wenn Sie auf Emacs 23 oder sogar 22 abzielen. "Pakete" sind in Emacs vor Emacs 24 nicht vorhanden, als der Paketmanager hinzugefügt wurde.

Bündelung mit einer Bibliothek

Bündeln Sie es.

Da es keine Standardmethode gibt, um Bibliotheken vor Paketen zu installieren, können Sie json.el in alles bündeln, was Sie Ihren Benutzern geben - eine Art Archiv, nehme ich an. Sie müssen es ohnehin manuell installieren und können so die benötigten Dateien auswählen: Nur Ihre Bibliothek für Emacs 24/25 Benutzer, Ihre Bibliothek + json.el für Benutzer mit älteren Versionen.

Solange Sie dies dokumentieren, wird es keine Probleme verursachen.

Mit einem Paket bündeln

Bündeln Sie es auf keinen Fall.

Wenn Sie jedoch ein geeignetes Paket für Emacs 24 und höher erstellen, dürfenjson.el Sie es nicht einschließen .

Der Paketmanager installiert Ihre mitgelieferte Kopie gerne json.elzusammen mit Ihrer eigentlichen Bibliothek. Da Pakete in load-pathIhrer mitgelieferten Kopie von zuerst an erster Stelle json.elstehen, überschreiben sie jetzt die integrierte, was bei Paketen, die eine neuere Version von erwarten, allerlei Probleme verursacht json.el.

Der Weg zu gehen (meiner Meinung nach)

Erstellen Sie zwei Distributionen Ihres Pakets:

  • Ein geeignetes Emacs-Paket für Emacs 24 und höher, z. B. eine TAR mit den entsprechenden Paketmetadaten. Sie können sogar ein kleines Paket-Repository mit Ihrem Paket hosten, um Updates automatisch an Emacs 24-Benutzer zu verteilen.
  • Eine TAR-Datei mit Ihrer Bibliothek und json.el, jedoch ohne Paketmetadaten für Benutzer älterer Emacs-Versionen.

Das einzige, worauf Sie achten müssen, ist, wenn Benutzer älterer Emacs-Versionen auf Emacs 24 aktualisieren. In diesem Fall müssen sie die vorherige Installation Ihrer Bibliothek zusammen mit json.eldem richtigen Emacs 24-Paket manuell entfernen und erneut installieren.

Eine Alternative

Wenn Sie nicht zwei verschiedene Distributionen pflegen möchten, können Sie diese bündeln json.el, jedoch unter einem anderen Namen, z my-library-json-compat.el. Mit einem anderen Namen json.elüberschreibt Ihre Bundle-Kopie niemals die integrierte.

Da die Funktionen und Symbole in der gebündelten Kopie immer noch mit der integrierten Kopie in Konflikt stehen, müssen Sie darauf achten, dass Sie Ihre gebündelte Kopie nicht laden, wenn die reale json.elVersion verfügbar ist. Dies ist jedoch einfach:

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

Emacs versucht zu laden json.el, andernfalls wird auf Ihre gebündelte Kopie unter einem anderen Namen zurückgegriffen.

Der wahre Weg (meiner Meinung nach)

Bitten Sie Ihre Benutzer, auf Emacs 24 zu aktualisieren. Die letzte Version von Emacs 22 ist vor acht (!) Jahren, die letzte Version von Emacs 23 noch vor vier Jahren. Beide Versionen sind veraltet und verfügen nicht über viele Funktionen. Viele Pakete (z. B. Magit) unterstützen heutzutage nur noch Emacs 24. Emacs 22/23 sind eine Sackgasse und es gibt keinen Weg nach vorne.

Das Aktualisieren auf Emacs 24 ist einfach genug: Die meisten modernen Linux-Distributionen enthalten mindestens Emacs 24.1 in ihren Paket-Repositorys. Für OS X sind vorgefertigte App-Bundles verfügbar, und der neueste stabile Emacs 24 ist im beliebten OS X-Paketmanager Homebrew enthalten.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.