Sök…


Anmärkningar

ASDF - En annan systemdefinitionsfacilitet

ASDF är ett verktyg för att specificera hur system med Common Lisp-programvara består av komponenter (undersystem och filer), och hur man arbetar på dessa komponenter i rätt ordning så att de kan kompileras, laddas, testas, etc.

Enkelt ASDF-system med en platt katalogstruktur

Tänk på detta enkla projekt med en platt katalogstruktur:

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

example.asd fil är egentligen bara en Lisp-fil med lite mer än ett ASDF-specifikt funktionssamtal. Antar att ditt projekt beror på drakma och clsql systemen, kan innehållet vara något liknande:

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

När du laddar denna Lisp-fil berättar du ASDF om ditt :example system, men du laddar inte själva systemet ännu. Det görs antingen av (asdf:require-system :example) eller (ql:quickload :example) .

Och när du laddar systemet kommer ASDF att:

  1. Ladda beroenden - i det här fallet ASDF-systemen clsql och drakma
  2. Kompilera och ladda komponenterna i ditt system, dvs. Lisp-filer, baserat på de givna beroenden
    1. packages först (inga beroenden)
    2. functions efter packages (eftersom det bara beror på packages ), men före main (vilket beror på det)
    3. main after- functions (eftersom det beror på packages och functions )
    4. tools när som helst efter packages

Kom ihåg:

  • Ange beroenden som de behövs (t.ex. behövs makrodefinitioner före användning). Om du inte gör det kommer ASDF att göra fel när du laddar ditt system.
  • Alla listade filer slutar på .lisp men detta postfix ska tappas i asdf-skriptet
  • Om ditt system heter samma som .asd filen och du flyttar (eller symlink) dess mapp till quicklisp/local-projects/ folder kan du sedan ladda projektet med (ql:quickload "example") .
  • Bibliotek som ditt system beror på måste vara kända för antingen ASDF (via ASDF:*CENTRAL-REGISTRY variabel) eller Quicklisp (antingen via QUICKLISP-CLIENT:*LOCAL-PROJECT-DIRECTORIES* variabel eller tillgänglig i någon av dess dists)

Hur man definierar en testoperation för ett 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)

Anmärkningar:

  • Vi antar att systemet : foo-test definierar ett paket som heter "FOO-TESTS"
  • run-tests är startpunkten för testlöparen
  • uoip: symbol-samtal gör det möjligt att definiera en metod som kallar en funktion som ännu inte har lästs. Paketet där funktionen definieras finns inte när vi definierar systemet

I vilket paket ska jag definiera mitt ASDF-system?

ASDF tillhandahåller paketet ASDF-USER för utvecklare att definiera sina paket i.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow