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
clsql
idrakma
- Skompiluj i załaduj składniki systemu, tj. Pliki Lisp, w oparciu o podane zależności
- najpierw
packages
(bez zależności) -
functions
popackages
(ponieważ zależy to tylko odpackages
), ale przedmain
(który zależy od niego) -
main
pofunctions
(ponieważ zależy to odpackages
ifunctions
) -
tools
dowolnym 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
.lisp
ale ten postfiks powinien zostać usunięty ze skryptu asdf - Jeśli twój system ma taką samą nazwę jak plik
.asd
i 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-tests
to 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.