common-lisp
ASDF - Nog een systeemdefinitiefaciliteit
Zoeken…
Opmerkingen
ASDF - Nog een systeemdefinitiefaciliteit
ASDF is een hulpmiddel om aan te geven hoe systemen van Common Lisp-software zijn opgebouwd uit componenten (subsystemen en bestanden) en hoe deze componenten in de juiste volgorde kunnen worden gebruikt, zodat ze kunnen worden gecompileerd, geladen, getest, enz.
Eenvoudig ASDF-systeem met een platte mapstructuur
Beschouw dit eenvoudige project met een platte mappenstructuur:
example
|-- example.asd
|-- functions.lisp
|-- main.lisp
|-- packages.lisp
`-- tools.lisp
Het bestand example.asd
is eigenlijk gewoon een ander Lisp-bestand met weinig meer dan een ASDF-specifieke functieaanroep. Ervan uitgaande dat uw project afhankelijk is van de drakma
en clsql
systemen, kan de inhoud ervan ongeveer zo zijn:
(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"))))
Wanneer u dit Lisp-bestand laadt, vertelt u ASDF over uw :example
, maar u laadt het systeem zelf nog niet. Dat gebeurt door (asdf:require-system :example)
of (ql:quickload :example)
.
En wanneer u het systeem laadt, zal ASDF:
- Laad de afhankelijkheden - in dit geval de ASDF-systemen
clsql
endrakma
- Compileer en laad de componenten van uw systeem, dwz de Lisp-bestanden, op basis van de gegeven afhankelijkheden
-
packages
eerst (geen afhankelijkheden) -
functions
napackages
(omdat het alleen vanpackages
afhangt), maar vóórmain
(wat ervan afhangt) -
main
after-functions
(afhankelijk vanpackages
enfunctions
) -
tools
elk moment napackages
-
Onthoud:
- Voer de afhankelijkheden in zoals ze nodig zijn (bijvoorbeeld macro-definities zijn nodig voor gebruik). Als u dat niet doet, geeft ASDF een foutmelding bij het laden van uw systeem.
- Alle vermelde bestanden eindigen op
.lisp
maar deze postfix moet in het asdf-script worden verwijderd - Als uw systeem dezelfde naam heeft als het
.asd
bestand en u de map verplaatst (of symlink) naarquicklisp/local-projects/
folder, kunt u het project laden met behulp van(ql:quickload "example")
. - Bibliotheken waarvan uw systeem afhankelijk is, moeten bekend zijn bij ASDF (via de
ASDF:*CENTRAL-REGISTRY
variabele) of Quicklisp (hetzij via deQUICKLISP-CLIENT:*LOCAL-PROJECT-DIRECTORIES*
of beschikbaar in een van zijn lijsten)
Hoe een testbewerking voor een systeem te definiëren
(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)
Opmerkingen:
- We nemen aan dat het systeem : foo-tests een pakket definieert met de naam "FOO-TESTS"
-
run-tests
is het startpunt voor de testloper - uoip: symbol-call maakt het mogelijk om een methode te definiëren die een functie aanroept die nog niet is gelezen. Het pakket waarin de functie is gedefinieerd, bestaat niet wanneer we het systeem definiëren
In welk pakket moet ik mijn ASDF-systeem definiëren?
ASDF biedt het pakket ASDF-USER
voor ontwikkelaars om hun pakketten in te definiëren.