common-lisp
ASDF - En annan systemdefinitionsfacilitet
Sök…
Anmärkningar
ASDF - En annan systemdefinitionsfacilitet
ASDF är ett verktyg för att specificera hur system med Common Lisp-programvara består av komponenter (undersystem och filer), och hur man arbetar på dessa komponenter i rätt ordning så att de kan kompileras, laddas, testas, etc.
Enkelt ASDF-system med en platt katalogstruktur
Tänk på detta enkla projekt med en platt katalogstruktur:
example
|-- example.asd
|-- functions.lisp
|-- main.lisp
|-- packages.lisp
`-- tools.lisp
example.asd fil är egentligen bara en Lisp-fil med lite mer än ett ASDF-specifikt funktionssamtal. Antar att ditt projekt beror på drakma och clsql systemen, kan innehållet vara något liknande:
(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"))))
När du laddar denna Lisp-fil berättar du ASDF om ditt :example system, men du laddar inte själva systemet ännu. Det görs antingen av (asdf:require-system :example) eller (ql:quickload :example) .
Och när du laddar systemet kommer ASDF att:
- Ladda beroenden - i det här fallet ASDF-systemen
clsqlochdrakma - Kompilera och ladda komponenterna i ditt system, dvs. Lisp-filer, baserat på de givna beroenden
-
packagesförst (inga beroenden) -
functionsefterpackages(eftersom det bara beror påpackages), men föremain(vilket beror på det) -
mainafter-functions(eftersom det beror påpackagesochfunctions) -
toolsnär som helst efterpackages
-
Kom ihåg:
- Ange beroenden som de behövs (t.ex. behövs makrodefinitioner före användning). Om du inte gör det kommer ASDF att göra fel när du laddar ditt system.
- Alla listade filer slutar på
.lispmen detta postfix ska tappas i asdf-skriptet - Om ditt system heter samma som
.asdfilen och du flyttar (eller symlink) dess mapp tillquicklisp/local-projects/folder kan du sedan ladda projektet med(ql:quickload "example"). - Bibliotek som ditt system beror på måste vara kända för antingen ASDF (via
ASDF:*CENTRAL-REGISTRYvariabel) eller Quicklisp (antingen viaQUICKLISP-CLIENT:*LOCAL-PROJECT-DIRECTORIES*variabel eller tillgänglig i någon av dess dists)
Hur man definierar en testoperation för ett 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)
Anmärkningar:
- Vi antar att systemet : foo-test definierar ett paket som heter "FOO-TESTS"
-
run-testsär startpunkten för testlöparen - uoip: symbol-samtal gör det möjligt att definiera en metod som kallar en funktion som ännu inte har lästs. Paketet där funktionen definieras finns inte när vi definierar systemet
I vilket paket ska jag definiera mitt ASDF-system?
ASDF tillhandahåller paketet ASDF-USER för utvecklare att definiera sina paket i.