Zoeken…


Opmerkingen

ASDF - Nog een systeemdefinitiefaciliteit

ASDF is een hulpmiddel om aan te geven hoe systemen van Common Lisp-software zijn opgebouwd uit componenten (subsystemen en bestanden) en hoe deze componenten in de juiste volgorde kunnen worden gebruikt, zodat ze kunnen worden gecompileerd, geladen, getest, enz.

Eenvoudig ASDF-systeem met een platte mapstructuur

Beschouw dit eenvoudige project met een platte mappenstructuur:

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

Het bestand example.asd is eigenlijk gewoon een ander Lisp-bestand met weinig meer dan een ASDF-specifieke functieaanroep. Ervan uitgaande dat uw project afhankelijk is van de drakma en clsql systemen, kan de inhoud ervan ongeveer zo zijn:

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

Wanneer u dit Lisp-bestand laadt, vertelt u ASDF over uw :example , maar u laadt het systeem zelf nog niet. Dat gebeurt door (asdf:require-system :example) of (ql:quickload :example) .

En wanneer u het systeem laadt, zal ASDF:

  1. Laad de afhankelijkheden - in dit geval de ASDF-systemen clsql en drakma
  2. Compileer en laad de componenten van uw systeem, dwz de Lisp-bestanden, op basis van de gegeven afhankelijkheden
    1. packages eerst (geen afhankelijkheden)
    2. functions na packages (omdat het alleen van packages afhangt), maar vóór main (wat ervan afhangt)
    3. main after- functions (afhankelijk van packages en functions )
    4. tools elk moment na packages

Onthoud:

  • Voer de afhankelijkheden in zoals ze nodig zijn (bijvoorbeeld macro-definities zijn nodig voor gebruik). Als u dat niet doet, geeft ASDF een foutmelding bij het laden van uw systeem.
  • Alle vermelde bestanden eindigen op .lisp maar deze postfix moet in het asdf-script worden verwijderd
  • Als uw systeem dezelfde naam heeft als het .asd bestand en u de map verplaatst (of symlink) naar quicklisp/local-projects/ folder, kunt u het project laden met behulp van (ql:quickload "example") .
  • Bibliotheken waarvan uw systeem afhankelijk is, moeten bekend zijn bij ASDF (via de ASDF:*CENTRAL-REGISTRY variabele) of Quicklisp (hetzij via de QUICKLISP-CLIENT:*LOCAL-PROJECT-DIRECTORIES* of beschikbaar in een van zijn lijsten)

Hoe een testbewerking voor een systeem te definiëren

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

Opmerkingen:

  • We nemen aan dat het systeem : foo-tests een pakket definieert met de naam "FOO-TESTS"
  • run-tests is het startpunt voor de testloper
  • uoip: symbol-call maakt het mogelijk om een methode te definiëren die een functie aanroept die nog niet is gelezen. Het pakket waarin de functie is gedefinieerd, bestaat niet wanneer we het systeem definiëren

In welk pakket moet ik mijn ASDF-systeem definiëren?

ASDF biedt het pakket ASDF-USER voor ontwikkelaars om hun pakketten in te definiëren.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow