Nehmen wir an, ich baue eine Anwendung über net.aserve
und bordeaux-threads
. Meine Paketdeklaration könnte so aussehen:
Ich benutze Quicklisp, also führe ich (ql:quickload "aserve") (ql:quickload "bordeaux-threads")
in SLIME aus, bevor ich mein Paket kompiliere, und alles ist in Ordnung.
Natürlich starte ich morgen wieder SLIME und ich muss daran denken, die QUICKLOAD
s auszugeben, bevor ich kompiliere, sonst bin ich in Schwierigkeiten.
Ich könnte etwas wie
setzen %Vor%ganz oben in meinem Paket - das habe ich für die Entwicklung getan -, aber ich habe das Gefühl, dass es keine gute Idee ist, einen Paketmanager für einen Benutzer zu erzwingen.
Gibt es eine bessere Alternative?
Verwenden Sie quickproject (zugänglich über (ql:quickload :quickproject)
), um ein System für Ihre Anwendung zu erstellen. Als z_axis beschrieben, können Sie dann die Liste der Abhängigkeiten in der defsystem
-Deklaration füllen (falls Sie beim Aufruf von quickproject:make-project
etwas übersehen haben).
Wenn Sie Ihr neues Projekt im local-projects
Pfad von Quicklisp erstellen Installation können Sie Ihr Projekt auch schnell laden (auch wenn es noch nicht Teil der Quicklisp-Distribution ist). Beim Schnellladen Ihres Projekts werden natürlich die Abhängigkeiten heruntergeladen (wenn sie Teil der Quicklisp-Distribution sind) und dann geladen.
Ich hatte genau die gleiche Frage und ich stimme zu, ich sollte einen Paketmanager nicht auf einen Benutzer zwingen. Vor der Zeit von quicklisp habe ich clbuild benutzt und alle .asd-Dateien in ein system / -Verzeichnis gelegt. Solange sich das Verzeichnis 'systems /' in asdf: central-registry befindet, kann man (zumindest in SBCL und CCL) einfach (a-package) alle relevanten Pakete laden. Das neue clbuild2 behält diese Funktion bei, wenn Sie "from-upstream" installieren, und die integrierte Quicklisp-Version berücksichtigt die getrennt installierten Upstream-Pakete. Quicklisp-installierte Pakete stellen jedoch ihre .asd-Dateien nicht mehr zur Verfügung.
Also ist meine Lösung, ein Shell-Skript zu schreiben, das alle quicklisp installierten Pakete scannt, normalerweise unter dists / quicklisp / software /, und alle .asd-Dateien dort an einen zentralen Ort verbindet. Auf diese Weise muss man Quicklisp nicht in das cl-Image laden, wenn man nur quicklisp installierte Pakete verwenden möchte. Ich hoffe, dass Quicklisp diese Funktion standardmäßig liefern kann.
Wenn Sie keinen Quicklisp-Aufruf in den bereitgestellten Quellcode aufnehmen möchten, trennen Sie die QuickProject-Systemdefinitionsdatei vom Rest der Quelle.
Fügen Sie am Anfang der Quelle, unmittelbar vor dem Aufruf defpackage
, die erforderlichen (require ...)
für Ihre Paketabhängigkeiten hinzu. Dies garantiert, dass diese Lisp-Pakete (irgendwie) geladen werden, bevor sie fortfahren, spezifiziert aber nicht, "wie" diese Pakete geladen werden. Sie könnten geladen werden, indem der Aufruf ql:quickload :my-package
(mit quickproject) ausgeführt wird, der zuerst die Abhängigkeiten lädt und dann beim Laden der Quelle die Requests aufruft. Oder möglicherweise könnte ein Benutzer die Quelle direkt laden (ohne ql:quickload
aufzurufen), und die Abhängigkeiten würden während des Require-Aufrufs geladen werden, wenn diese Abhängigkeiten in *module-search-path*
gefunden werden können. Diese Technik würde, wie Sie sagten, es dem Endbenutzer ermöglichen, jedes Build-Tool zu verwenden, das seine Quelle laden soll.
Nachdem quicklisp einige Minuten damit experimentiert hat, scheint es, dass quicklisp in den require Funktionsaufruf zwischengespeichert wird. Wenn quicklisp installiert ist und (require :bordeaux-threads)
z. B. aufgerufen wird, verwendet lisp quicklisp, um diese Abhängigkeit herunterzuladen und zu installieren. Dies ist ein sehr nettes Feature (IMO), da es der Common Lisp-Standardfunktion require
als Schnittstellenebene dient und das spezifische Build-Tool abstrahiert, das zur Erfüllung der Abhängigkeit verwendet wird. Quicklisp kann in das require, asdf einrasten (IIRC), etc.
Um Ihre Frage zu beantworten, sollten Quicklisp-Aufrufe im implementierten Quellcode nicht an eine beliebige Stelle gesetzt werden, und requires
sollte verwendet werden, um sicherzustellen, dass Abhängigkeiten geladen werden, bevor die Paketdefinitionsdatei ausgewertet wird. Wenn vor dem Laden der Paketdefinitionsdatei quicklisp installiert ist, werden diese Anforderungen erfüllt, indem quicklisp zum Herunterladen und Installieren der Abhängigkeiten verwendet wird. Wenn jemand asdf installiert hat, sind diese Abhängigkeiten mit diesem Build-Tool zufrieden. Und wenn jemand die Abhängigkeiten bereits installiert hat (mit einer anderen Technik), werden die Requests einfach weitergegeben.
Tags und Links lisp common-lisp quicklisp allegro-cl