Wohin soll Quicklisp QUICKLOAD in meiner Quelle gehen? Nirgends?

7

Nehmen wir an, ich baue eine Anwendung über net.aserve und bordeaux-threads . Meine Paketdeklaration könnte so aussehen:

%Vor%

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?

    
Ashe 23.03.2012, 00:06
quelle

4 Antworten

11

In Ihrer ASD-Datei sollten Sie die abhängige Darstellung wie folgt definieren: ''

%Vor%

Danach müssen Sie nur noch (ql: quickload: asserve).

    
z_axis 23.03.2012, 01:26
quelle
10

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.

    
Miron Brezuleanu 23.03.2012 06:45
quelle
2

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.

    
z9p 21.05.2013 00:47
quelle
2

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.

    
Clayton Stanley 29.05.2013 18:56
quelle