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:

  1. Charger les dépendances - dans ce cas, les systèmes ASDF clsql et drakma
  2. Compiler et charger les composants de votre système, c'est-à-dire les fichiers Lisp, en fonction des dépendances données
    1. packages premier (pas de dépendances)
    2. functions après les packages (comme cela ne dépend que des packages ), mais avant le main (qui en dépend)
    3. main functions après (comme cela dépend des packages et des functions )
    4. tools tout moment après les packages

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



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow