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 разработчикам для определения своих пакетов.