common-lisp
ASDF - другой механизм определения системы
Поиск…
замечания
ASDF - другой механизм определения системы
ASDF - это инструмент для определения того, как системы программного обеспечения Common Lisp состоят из компонентов (подсистем и файлов) и как работать с этими компонентами в правильном порядке, чтобы их можно было компилировать, загружать, тестировать и т. Д.
Простая система ASDF с плоской структурой каталогов
Рассмотрим этот простой проект с плоской структурой каталогов:
example
|-- example.asd
|-- functions.lisp
|-- main.lisp
|-- packages.lisp
`-- tools.lisp
Файл example.asd
- это просто еще один файл Lisp, содержащий немного больше, чем вызов функции ASDF. Предполагая, что ваш проект зависит от систем drakma
и clsql
, его содержимое может быть примерно таким:
(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"))))
Когда вы загружаете этот файл Lisp, вы указываете ASDF о своей системе :example
, но вы еще не загружаете систему. Это делается либо (asdf:require-system :example)
либо (ql:quickload :example)
.
И когда вы загружаете систему, ASDF будет:
- Загрузите зависимости - в этом случае системы
clsql
иdrakma
- Компилируйте и загрузите компоненты вашей системы, то есть файлы Lisp, основанные на данных зависимостях
-
packages
сначала (без зависимостей) -
functions
послеpackages
(поскольку это зависит только отpackages
), но доmain
(что зависит от него) -
main
послеfunctions
(поскольку это зависит отpackages
иfunctions
) -
tools
любое время послеpackages
-
Иметь ввиду:
- Введите зависимости по мере необходимости (например, для использования требуется определение макросов). Если вы этого не сделаете, ASDF будет ошибочно при загрузке вашей системы.
- Все перечисленные файлы заканчиваются на
.lisp
но этот постфикс должен быть.lisp
в сценарии asdf - Если ваша система названа так же, как и ее
.asd
файл, и вы перемещаете (или символизируете) ее папку в папкуquicklisp/local-projects/
, вы можете загрузить проект, используя(ql:quickload "example")
. - Библиотеки, зависящие от вашей системы, должны быть известны либо ASDF (через
ASDF:*CENTRAL-REGISTRY
), либо Quicklisp (либо черезQUICKLISP-CLIENT:*LOCAL-PROJECT-DIRECTORIES*
либо доступны в любом из ее дисках)
Как определить тестовую операцию для системы
(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)
Заметки:
- Мы предполагаем, что система : foo-tests определяет пакет под названием «FOO-TESTS»
-
run-tests
- это точка входа для тестового бегуна - uoip: symbol-call позволяет определить метод, который вызывает функцию, которая еще не была прочитана. Пакет, определяемый функцией, не существует, когда мы определяем систему
В каком пакете я должен определить свою систему ASDF?
ASDF предоставляет пакет ASDF-USER
разработчикам для определения своих пакетов.