common-lisp
ASDF - Un'altra funzione di definizione del sistema
Ricerca…
Osservazioni
ASDF - Un'altra funzione di definizione del sistema
ASDF è uno strumento per specificare come i sistemi del software Common Lisp sono costituiti da componenti (sottosistemi e file) e come operare su questi componenti nell'ordine corretto in modo che possano essere compilati, caricati, testati, ecc.
Semplice sistema ASDF con una struttura di directory piatta
Considera questo semplice progetto con una struttura di directory piatta:
example
|-- example.asd
|-- functions.lisp
|-- main.lisp
|-- packages.lisp
`-- tools.lisp
Il file example.asd
è in realtà solo un altro file Lisp con poco più di una chiamata di funzione specifica ASDF. Supponendo che il tuo progetto dipenda clsql
sistemi drakma
e clsql
, il suo contenuto può essere qualcosa del genere:
(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"))))
Quando carichi questo file Lisp, dici ad ASDF del tuo :example
sistema, ma non stai ancora caricando il sistema stesso. Questo viene fatto da (asdf:require-system :example)
o (ql:quickload :example)
.
E quando si carica il sistema, ASDF:
- Carica le dipendenze - in questo caso i sistemi ASDF
clsql
edrakma
- Compilare e caricare i componenti del sistema, ovvero i file Lisp, in base alle dipendenze fornite
- prima i
packages
(nessuna dipendenza) -
functions
dopo ipackages
(poiché dipende solo daipackages
), ma prima dimain
(che dipende da esso) -
main
afterfunctions
(in quanto dipende dapackages
efunctions
) -
tools
qualsiasi momento dopo ipackages
- prima i
Tieni a mente:
- Immettere le dipendenze come sono necessarie (ad esempio, le definizioni di macro sono necessarie prima dell'utilizzo). In caso contrario, ASDF eseguirà un errore durante il caricamento del sistema.
- Tutti i file elencati terminano con
.lisp
ma questo postfix deve essere eliminato nello script asdf - Se il tuo sistema ha lo stesso nome del suo file
.asd
e muovi (o symlink) la sua cartella nella cartellaquicklisp/local-projects/
, puoi caricare il progetto usando(ql:quickload "example")
. - Le librerie da cui dipende il tuo sistema devono essere note a ASDF (tramite la variabile
ASDF:*CENTRAL-REGISTRY
) o Quicklisp (tramite laQUICKLISP-CLIENT:*LOCAL-PROJECT-DIRECTORIES*
o disponibile in una delle sue dist)
Come definire un'operazione di test per un sistema
(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)
Gli appunti:
- Supponiamo che il sistema : foo-tests definisce un pacchetto chiamato "FOO-TESTS"
-
run-tests
è il punto di ingresso per il corridore di prova - uoip: symbol-call consente di definire un metodo che chiama una funzione che non è stata ancora letta. Il pacchetto in cui è definita la funzione non esiste quando definiamo il sistema
In quale pacchetto dovrei definire il mio sistema ASDF?
ASDF fornisce il pacchetto ASDF-USER
per gli sviluppatori per definire i loro pacchetti in.