common-lisp
ASDF - Une autre installation de définition de système
Recherche…
Remarques
ASDF - Une autre installation de définition de système
ASDF est un outil permettant de spécifier la manière dont les systèmes Common Lisp sont constitués de composants (sous-systèmes et fichiers) et d’opérer sur ces composants dans le bon ordre afin qu’ils puissent être compilés, chargés, testés, etc.
Système ASDF simple avec une structure de répertoire plate
Considérez ce projet simple avec une structure de répertoire plate:
example
|-- example.asd
|-- functions.lisp
|-- main.lisp
|-- packages.lisp
`-- tools.lisp
Le fichier example.asd
n'est en réalité qu'un autre fichier Lisp avec un peu plus qu'un appel de fonction spécifique à ASDF. En supposant que votre projet dépend des systèmes drakma
et clsql
, son contenu peut être quelque chose comme ceci:
(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"))))
Lorsque vous chargez ce fichier Lisp, vous indiquez à ASDF votre :example
système, mais vous ne chargez pas encore le système lui-même. Cela se fait soit par (asdf:require-system :example)
ou (ql:quickload :example)
.
Et lorsque vous chargez le système, ASDF va:
- Charger les dépendances - dans ce cas, les systèmes ASDF
clsql
etdrakma
- Compiler et charger les composants de votre système, c'est-à-dire les fichiers Lisp, en fonction des dépendances données
-
packages
premier (pas de dépendances) -
functions
après lespackages
(comme cela ne dépend que despackages
), mais avant lemain
(qui en dépend) -
main
functions
après (comme cela dépend despackages
et desfunctions
) -
tools
tout moment après lespackages
-
Garder en tete:
- Entrez les dépendances nécessaires (par exemple, les définitions de macros sont nécessaires avant utilisation). Si vous ne le faites pas, ASDF commettra une erreur lors du chargement de votre système.
- Tous les fichiers listés se terminent par
.lisp
mais ce postfix devrait être déposé dans le script asdf - Si votre système porte le même nom que son fichier
.asd
et que vous déplacez (ou créez un lien symbolique) son dossier dans le dossierquicklisp/local-projects/
, vous pouvez alors charger le projet en utilisant(ql:quickload "example")
. - Les bibliothèques dont dépend votre système doivent être connues d'ASDF (via la variable
ASDF:*CENTRAL-REGISTRY
) ou Quicklisp (via laQUICKLISP-CLIENT:*LOCAL-PROJECT-DIRECTORIES*
ou disponibles dans l'un de ses dists)
Comment définir une opération de test pour un système
(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)
Remarques:
- Nous supposons que le système : foo-tests définit un paquet nommé "FOO-TESTS"
-
run-tests
est le point d'entrée pour le coureur de test - uoip: l'appel de symbole permet de définir une méthode qui appelle une fonction qui n'a pas encore été lue. Le paquet dans lequel la fonction est définie n'existe pas lorsque nous définissons le système
Dans quel paquet dois-je définir mon système ASDF?
ASDF fournit le package ASDF-USER
aux développeurs pour définir leurs packages.