common-lisp Sistema ASDF simple con una estructura de directorio plana.


Ejemplo

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:

  1. Cargue las dependencias, en este caso los sistemas ASDF clsql y drakma
  2. Compile y cargue los componentes de su sistema, es decir, los archivos Lisp, según las dependencias dadas
    1. packages primero (sin dependencias)
    2. functions después de los packages (ya que solo depende de los packages ), pero antes de main (que depende de ellos)
    3. functions main posteriores (ya que depende de packages y functions )
    4. tools cualquier momento después de los packages

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 a quicklisp/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 de QUICKLISP-CLIENT:*LOCAL-PROJECT-DIRECTORIES* variable o disponible en cualquiera de sus dists)