common-lisp
ASDF - Eine weitere Systemdefinitionsfunktion
Suche…
Bemerkungen
ASDF - Eine weitere Systemdefinitionsfunktion
ASDF ist ein Werkzeug, mit dem festgelegt wird, wie Systeme von Common Lisp-Software aus Komponenten (Subsystemen und Dateien) bestehen und wie diese Komponenten in der richtigen Reihenfolge verwendet werden, damit sie kompiliert, geladen, getestet usw. werden können.
Einfaches ASDF-System mit flacher Verzeichnisstruktur
Betrachten Sie dieses einfache Projekt mit einer flachen Verzeichnisstruktur:
example
|-- example.asd
|-- functions.lisp
|-- main.lisp
|-- packages.lisp
`-- tools.lisp
Die Datei example.asd
ist eigentlich nur eine weitere Lisp-Datei mit etwas mehr als einem ASDF-spezifischen Funktionsaufruf. Angenommen, Ihr Projekt hängt von den drakma
und clsql
Systemen ab. Sein Inhalt kann etwa so aussehen:
(asdf:defsystem :example :description "a simple example project" :version "1.0" :author "TheAuthor" :depends-on (:clsql :drakma) :components ((:file "packages") (:file "tools" :depends-on ("packages")) (:file "functions" :depends-on ("packages")) (:file "main" :depends-on ("packages" "functions"))))
Wenn Sie diese Lisp-Datei laden, informieren Sie ASDF über Ihr :example
, aber Sie laden das System selbst noch nicht. (asdf:require-system :example)
erfolgt entweder durch (asdf:require-system :example)
oder (ql:quickload :example)
.
Und wenn Sie das System laden, wird ASDF:
- Laden Sie die Abhängigkeiten - in diesem Fall die ASDF-Systeme
clsql
unddrakma
- Kompilieren und laden Sie die Komponenten Ihres Systems, dh die Lisp-Dateien, basierend auf den angegebenen Abhängigkeiten
-
packages
zuerst (keine Abhängigkeiten) -
functions
nachpackages
(da es nur vonpackages
abhängt), aber vormain
(was davon abhängt) -
main
nachfunctions
(wie es hängt davon ab ,packages
undfunctions
) -
tools
jederzeit nachpackages
-
Merken Sie sich:
- Geben Sie die Abhängigkeiten so ein, wie sie benötigt werden (z. B. sind Makrodefinitionen vor der Verwendung erforderlich). Wenn Sie dies nicht tun, wird beim Laden Ihres Systems ein Fehler bei ASDF auftreten.
- Alle aufgelisteten Dateien enden auf
.lisp
aber dieses Postfix sollte im asdf-Skript abgelegt werden - Wenn Ihr System genauso benannt ist wie seine
.asd
Datei und Sie den Ordner (oder Symlink) in den Ordnerquicklisp/local-projects/
, können Sie das Projekt dann mit(ql:quickload "example")
. - Bibliotheken, von denen Ihr System abhängig ist, müssen entweder ASDF (über die Variable
ASDF:*CENTRAL-REGISTRY
) oder Quicklisp (entweder über dieQUICKLISP-CLIENT:*LOCAL-PROJECT-DIRECTORIES*
oder in einer ihrer Listen) bekannt sein.
So definieren Sie einen Testvorgang für ein System
(in-package #:asdf-user)
(defsystem #:foo
:components ((:file "foo"))
:in-order-to ((asdf:test-op (asdf:load-op :foo)))
:perform (asdf:test-op (o c)
(uiop:symbol-call :foo-tests 'run-tests)))
(defsystem #:foo-tests
:name "foo-test"
:components ((:file "tests")))
;; Afterwards to run the tests we type in the REPL
(asdf:test-system :foo)
Anmerkungen:
- Wir gehen davon aus, dass das System : foo-tests ein Paket mit dem Namen "FOO-TESTS" definiert.
-
run-tests
ist der Einstiegspunkt für den Testläufer - uoip: symbol-call erlaubt das Definieren einer Methode, die eine noch nicht gelesene Funktion aufruft. Das Paket, in dem die Funktion definiert ist, existiert nicht, wenn wir das System definieren
In welchem Paket sollte ich mein ASDF-System definieren?
ASDF stellt das Paket ASDF-USER
zur Verfügung, mit dem Entwickler ihre Pakete definieren können.