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
clsql
ochdrakma
- Kompilera och ladda komponenterna i ditt system, dvs. Lisp-filer, baserat på de givna beroenden
-
packages
först (inga beroenden) -
functions
efterpackages
(eftersom det bara beror påpackages
), men föremain
(vilket beror på det) -
main
after-functions
(eftersom det beror påpackages
ochfunctions
) -
tools
nä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å
.lisp
men detta postfix ska tappas i asdf-skriptet - Om ditt system heter samma som
.asd
filen 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-REGISTRY
variabel) 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.