common-lisp
ASDF - kolejny system definicji systemu
Szukaj…
Uwagi
ASDF - kolejny system definicji systemu
ASDF to narzędzie do określania, w jaki sposób systemy oprogramowania Common Lisp składają się z komponentów (podsystemów i plików) oraz jak operować tymi komponentami w odpowiedniej kolejności, aby można je było kompilować, ładować, testować itp.
Prosty system ASDF o płaskiej strukturze katalogów
Rozważ ten prosty projekt o płaskiej strukturze katalogów:
example
|-- example.asd
|-- functions.lisp
|-- main.lisp
|-- packages.lisp
`-- tools.lisp
Plik example.asd to tak naprawdę kolejny plik Lisp z niewiele więcej niż wywołaniem funkcji specyficznym dla ASDF. Zakładając, że twój projekt zależy od systemów drakma i clsql , jego zawartość może drakma clsql tak:
(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"))))
Kiedy ładujesz ten plik Lisp, mówisz ASDF o swoim :example systemie, ale nie ładujesz jeszcze samego systemu. Odbywa się to za pomocą (asdf:require-system :example) (ql:quickload :example) (asdf:require-system :example) lub (ql:quickload :example) .
A po załadowaniu systemu ASDF:
- Załaduj zależności - w tym przypadku systemy ASDF
clsqlidrakma - Skompiluj i załaduj składniki systemu, tj. Pliki Lisp, w oparciu o podane zależności
- najpierw
packages(bez zależności) -
functionspopackages(ponieważ zależy to tylko odpackages), ale przedmain(który zależy od niego) -
mainpofunctions(ponieważ zależy to odpackagesifunctions) -
toolsdowolnym momencie popackages
- najpierw
Pamiętać:
- Wprowadź zależności, jakie są potrzebne (np. Definicje makr są potrzebne przed użyciem). Jeśli tego nie zrobisz, ASDF popełni błąd podczas ładowania systemu.
- Wszystkie wymienione pliki kończą się na
.lispale ten postfiks powinien zostać usunięty ze skryptu asdf - Jeśli twój system ma taką samą nazwę jak plik
.asdi przeniesiesz (lub dowiązanie symboliczne) jego folder do folderuquicklisp/local-projects/folder, możesz następnie załadować projekt za pomocą(ql:quickload "example"). - Biblioteki, od których zależy Twój system, muszą być znane ASDF (poprzez zmienną
ASDF:*CENTRAL-REGISTRY) lub Quicklisp (albo poprzezQUICKLISP-CLIENT:*LOCAL-PROJECT-DIRECTORIES*lub dostępne w dowolnym katalogu)
Jak zdefiniować operację testową dla systemu
(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)
Uwagi:
- Zakładamy, że system : foo-testy definiuje pakiet o nazwie „FOO-TESTY”
-
run-teststo punkt wejścia dla testera - uoip: symbol-call pozwala zdefiniować metodę, która wywołuje funkcję, która nie została jeszcze odczytana. Pakiet, w którym zdefiniowano funkcję, nie istnieje, gdy definiujemy system
W jakim pakiecie powinienem zdefiniować mój system ASDF?
ASDF zapewnia programistom pakiet ASDF-USER w którym mogą definiować swoje pakiety.