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:

  1. Załaduj zależności - w tym przypadku systemy ASDF clsql i drakma
  2. Skompiluj i załaduj składniki systemu, tj. Pliki Lisp, w oparciu o podane zależności
    1. najpierw packages (bez zależności)
    2. functions po packages (ponieważ zależy to tylko od packages ), ale przed main (który zależy od niego)
    3. main po functions (ponieważ zależy to od packages i functions )
    4. tools dowolnym momencie po packages

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 folderu quicklisp/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 poprzez QUICKLISP-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.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow