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:

  1. Carica le dipendenze - in questo caso i sistemi ASDF clsql e drakma
  2. Compilare e caricare i componenti del sistema, ovvero i file Lisp, in base alle dipendenze fornite
    1. prima i packages (nessuna dipendenza)
    2. functions dopo i packages (poiché dipende solo dai packages ), ma prima di main (che dipende da esso)
    3. main after functions (in quanto dipende da packages e functions )
    4. tools qualsiasi momento dopo i packages

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 cartella quicklisp/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 la QUICKLISP-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.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow