common-lisp
ASDF - Otra facilidad de definición de sistema
Buscar..
Observaciones
ASDF - Otra facilidad de definición de sistema
ASDF es una herramienta para especificar cómo los sistemas del software Common Lisp se componen de componentes (subsistemas y archivos), y cómo operar estos componentes en el orden correcto para que puedan compilarse, cargarse, probarse, etc.
Sistema ASDF simple con una estructura de directorio plana.
Considere este proyecto simple con una estructura de directorio plana:
example
|-- example.asd
|-- functions.lisp
|-- main.lisp
|-- packages.lisp
`-- tools.lisp
El archivo example.asd
es en realidad otro archivo Lisp con poco más que una llamada de función específica de ASDF. Asumiendo que su proyecto depende de los sistemas drakma
y clsql
, su contenido puede ser algo como esto:
(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"))))
Cuando carga este archivo Lisp, le dice a ASDF sobre su :example
sistema de :example
, pero todavía no está cargando el sistema en sí. Esto se hace mediante (asdf:require-system :example)
o (ql:quickload :example)
.
Y cuando cargue el sistema, ASDF:
- Cargue las dependencias, en este caso los sistemas ASDF
clsql
ydrakma
- Compile y cargue los componentes de su sistema, es decir, los archivos Lisp, según las dependencias dadas
-
packages
primero (sin dependencias) -
functions
después de lospackages
(ya que solo depende de lospackages
), pero antes demain
(que depende de ellos) -
functions
main
posteriores (ya que depende depackages
yfunctions
) -
tools
cualquier momento después de lospackages
-
Tenga en cuenta:
- Ingrese las dependencias según sean necesarias (por ejemplo, las definiciones de macro son necesarias antes del uso). Si no lo hace, ASDF producirá un error al cargar su sistema.
- Todos los archivos enumerados terminan en
.lisp
pero este postfix debe eliminarse en el script asdf - Si su sistema tiene el mismo nombre que su archivo
.asd
, y mueve (o enlace simbólico) su carpeta aquicklisp/local-projects/
folder, puede cargar el proyecto usando(ql:quickload "example")
. - Las bibliotecas de las que depende su sistema deben ser conocidas por ASDF (a través de
ASDF:*CENTRAL-REGISTRY
variable) o Quicklisp (ya sea a través deQUICKLISP-CLIENT:*LOCAL-PROJECT-DIRECTORIES*
variable o disponible en cualquiera de sus dists)
Cómo definir una operación de prueba para 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)
Notas:
- Estamos asumiendo que el sistema : foo-tests define un paquete llamado "FOO-TESTS"
-
run-tests
es el punto de entrada para el corredor de prueba - uoip: symbol-call permite definir un método que llama a una función que aún no se ha leído. El paquete en el que se define la función no existe cuando definimos el sistema
¿En qué paquete debo definir mi sistema ASDF?
ASDF proporciona el paquete ASDF-USER
para que los desarrolladores definan sus paquetes en.