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
clsqlendrakma - Compileer en laad de componenten van uw systeem, dwz de Lisp-bestanden, op basis van de gegeven afhankelijkheden
-
packageseerst (geen afhankelijkheden) -
functionsnapackages(omdat het alleen vanpackagesafhangt), maar vóórmain(wat ervan afhangt) -
mainafter-functions(afhankelijk vanpackagesenfunctions) -
toolselk 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
.lispmaar deze postfix moet in het asdf-script worden verwijderd - Als uw systeem dezelfde naam heeft als het
.asdbestand 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-REGISTRYvariabele) 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-testsis 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.