Suche…


Bemerkungen

ASDF - Eine weitere Systemdefinitionsfunktion

ASDF ist ein Werkzeug, mit dem festgelegt wird, wie Systeme von Common Lisp-Software aus Komponenten (Subsystemen und Dateien) bestehen und wie diese Komponenten in der richtigen Reihenfolge verwendet werden, damit sie kompiliert, geladen, getestet usw. werden können.

Einfaches ASDF-System mit flacher Verzeichnisstruktur

Betrachten Sie dieses einfache Projekt mit einer flachen Verzeichnisstruktur:

example
|-- example.asd
|-- functions.lisp
|-- main.lisp
|-- packages.lisp
`-- tools.lisp

Die Datei example.asd ist eigentlich nur eine weitere Lisp-Datei mit etwas mehr als einem ASDF-spezifischen Funktionsaufruf. Angenommen, Ihr Projekt hängt von den drakma und clsql Systemen ab. Sein Inhalt kann etwa so aussehen:

(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"))))

Wenn Sie diese Lisp-Datei laden, informieren Sie ASDF über Ihr :example , aber Sie laden das System selbst noch nicht. (asdf:require-system :example) erfolgt entweder durch (asdf:require-system :example) oder (ql:quickload :example) .

Und wenn Sie das System laden, wird ASDF:

  1. Laden Sie die Abhängigkeiten - in diesem Fall die ASDF-Systeme clsql und drakma
  2. Kompilieren und laden Sie die Komponenten Ihres Systems, dh die Lisp-Dateien, basierend auf den angegebenen Abhängigkeiten
    1. packages zuerst (keine Abhängigkeiten)
    2. functions nach packages (da es nur von packages abhängt), aber vor main (was davon abhängt)
    3. main nach functions (wie es hängt davon ab , packages und functions )
    4. tools jederzeit nach packages

Merken Sie sich:

  • Geben Sie die Abhängigkeiten so ein, wie sie benötigt werden (z. B. sind Makrodefinitionen vor der Verwendung erforderlich). Wenn Sie dies nicht tun, wird beim Laden Ihres Systems ein Fehler bei ASDF auftreten.
  • Alle aufgelisteten Dateien enden auf .lisp aber dieses Postfix sollte im asdf-Skript abgelegt werden
  • Wenn Ihr System genauso benannt ist wie seine .asd Datei und Sie den Ordner (oder Symlink) in den Ordner quicklisp/local-projects/ , können Sie das Projekt dann mit (ql:quickload "example") .
  • Bibliotheken, von denen Ihr System abhängig ist, müssen entweder ASDF (über die Variable ASDF:*CENTRAL-REGISTRY ) oder Quicklisp (entweder über die QUICKLISP-CLIENT:*LOCAL-PROJECT-DIRECTORIES* oder in einer ihrer Listen) bekannt sein.

So definieren Sie einen Testvorgang für ein 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)

Anmerkungen:

  • Wir gehen davon aus, dass das System : foo-tests ein Paket mit dem Namen "FOO-TESTS" definiert.
  • run-tests ist der Einstiegspunkt für den Testläufer
  • uoip: symbol-call erlaubt das Definieren einer Methode, die eine noch nicht gelesene Funktion aufruft. Das Paket, in dem die Funktion definiert ist, existiert nicht, wenn wir das System definieren

In welchem ​​Paket sollte ich mein ASDF-System definieren?

ASDF stellt das Paket ASDF-USER zur Verfügung, mit dem Entwickler ihre Pakete definieren können.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow