Wie generiere und aktiviere ich Autoloads für lokale Pakete?

9

Es ist klar, dass nicht alle lokalen / benutzerdefinierten / persönlichen Pakete offiziell freigegeben werden sollten, und es wäre dumm, dies nur zu tun, um von der integrierten Unterstützung für die Paketverwaltung zu profitieren. Ich frage mich, wie Autoloads für lokale Pakete generiert und aktiviert werden können. Das ist ähnlich wie package.elbei den installierten Paketen von ELPA. Gibt es eine Möglichkeit, das Rad "vorzutäuschen", um zu vermeiden, dass ein lokales Verzeichnis (mit Unterverzeichnissen, von denen jedes ein lokales / benutzerdefiniertes / persönliches Paket ist) ELPA ist, um eine Neuerfindung des Rads zu vermeiden? Ich bin auch offen dafür, el-getob ein solches Szenario beispielsweise über benutzerdefinierte Rezepte unterstützt werden kann.

Ich bin mir sicher, dass die Aufgabe ziemlich häufig ist und jeder, der Emacs auf fortgeschrittenem Niveau verwendet, früher oder später an diesen Punkt kommt. Könnte jemand seine Erfahrungen auf diesem Gebiet teilen?

Alexander Shukaev
quelle
3
update-directory-autoloadskann unabhängig von jedem Paketmanager verwendet werden.
Npostavs
@npostavs, ich weiß, aber es ist nicht rekursiv und in diesem Fall keine umfassende Lösung. Sicher wird es nicht genug sein und ich müsste es in meine eigene Implementierung einwickeln.
Alexander Shukaev
1. Sie können eine Liste von Verzeichnissen (z. B. ein Verzeichnis und seine Nachkommen) bereitstellen update-directory-autoloads, um es tatsächlich rekursiv zu machen. 2. Sie können update-file-autoloadsfür jede Datei verwenden, die Sie interessiert, unabhängig davon, in welchem ​​Verzeichnis sie sich befindet.
Drew
Zu Ihrer Information: package.elist auch nicht rekursiv (dh es werden keine Pakete mit Quellen in Unterverzeichnissen unterstützt).
npostavs
Ich habe ein lokales MELPA unter Linux eingerichtet. Ich habe keine gute Lösung für Windows. Ich wünschte wirklich, Emacs würden diese Art von Dingen sofort unterstützen. Es könnte sich lohnen, das Use-Package zu überprüfen, um festzustellen, ob dies möglich ist.
eflanigan00

Antworten:

7

Die richtige Lösung (IMO) besteht darin, einen Paketmanager zu verwenden, der diesen Anwendungsfall explizit unterstützt. Dies wäre straight.el, was ich zu diesem Zweck geschrieben habe.

Sie können die ausführliche Dokumentation, einschließlich Vergleiche mit anderen Paketmanagern, in der README-Datei lesen. Ich werde mich also daran halten, wie Sie straight.elIhr spezifisches Problem lösen können.

  1. Platzieren Sie Ihr Repository in ~/.emacs.d/straight/repos/<my-repo>.
  2. Laden Sie es mit

    (straight-use-package '(<my-package> :local-repo "<my-repo>"))
    
  3. Du bist fertig. Wenn Sie Änderungen am Quellcode vornehmen, werden die automatische Ladegenerierung und die Bytekompilierung erneut ausgeführt (beim nächsten Emacs-Start). Sie erhalten auch Dinge wie Abhängigkeitsmanagement, optionale Versionskontrollautomatisierung usw. kostenlos.

  4. Wenn Sie das Paket veröffentlichen möchten, schieben Sie es einfach irgendwohin und ändern Sie das Rezept so, dass es auf dieses Git-Repository verweist.
  5. Sie können auch verwenden , straight.elmit , use-packagewenn Sie (es ist nur Syntax Zucker zum größten Teil) bevorzugen.
Radon Rosborough
quelle
3

Ich mache folgendes unter Linux:

Ich habe ein lokales Melpa-Repository eingerichtet, indem ich Melpa geklont habe.

Ich ändere die Rezepte, auf die ich auf meine lokalen Pakete verweisen möchte. Das Folgende istlocal-melpa/recipies/ace-window

(ace-window
  :url "/home/my_home/.emacs.d/packages/ace-window/"
  :fetcher git)

Geben Sie dann von local-mepla ein make alloder make recipies/ace-windowbauen Sie die Pakete einlocal-melpa/packages

Dann make packages/archive-contentswird die Liste der Pakete ausgefüllt.

Dann in Gebrauch zu folgen, um Emacs zu sagen, meine lokale Melpa zu verwenden

(setq package-archives '(("local-melpa" . "~/.emacs.d/packages/local-melpa/packages/")))

Ich habe nicht herausgefunden, wie man makeunter Windows läuft . Aber ich kann die Pakete local-melpaunter Linux einbauen und in Windows kopieren, und Emacs versteht und installiert die Pakete ordnungsgemäß.

Dies hat den Vorteil, dass ich jederzeit zurücksetzen kann, indem ich mein ~/.emacs.d/elpa/*Verzeichnis lösche und benutzerdefinierte Updates für jedes Paket installiere.

eflanigan00
quelle
Vielleicht wäre auch Quelpa von Interesse?
npostavs
Ich denke du hast recht npostavs. Ich muss mich setzen und es mir ansehen.
eflanigan00
2

Wenn Sie ein bereits installiertes Paket durch eine andere Version ersetzt haben und nur die Autoloads-Datei fehlt, können Sie sie mit package-generate-autoloads generieren:

(package-generate-autoloads "async" "~/.emacs.d/elpa/async-1.9.3/")

Ich fand es einfacher als die Verwendung von Update-Verzeichnis-Autotools, wenn ich ein Paket auf eine frühere Version herunterstufen muss.

Eigentlich glaube ich, dass ich Ihre Frage nicht wirklich beantwortet habe. Ich werde diese Antwort vorerst hier lassen, aber meine Antwort ist hier relevanter: /programming/26348561/how-to-generate-autoloads-for-elpa-packages/50100170

Andreas Raster
quelle