简单的 ASDF 系统,具有平面目录结构

考虑这个具有平面目录结构的简单项目:

example
|-- example.asd
|-- functions.lisp
|-- main.lisp
|-- packages.lisp
`-- tools.lisp

example.asd 文件实际上只是另一个 Lisp 文件,只有一个 ASDF 特定的函数调用。假设你的项目依赖于 drakmaclsql 系统,其内容可以是这样的:

(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 将:

  1. 加载依赖项 - 在本例中为 ASDF 系统 clsqldrakma
  2. ** 根据给定的依赖项编译和加载系统的组件,即 Lisp 文件
    1. 首先是 packages(没有依赖)
    2. packages 之后的 functions(因为它只取决于 packages),但是在 main 之前(取决于它)
    3. functions 之后的 main(因为它取决于 packagesfunctions
    4. tools 之后的任何时间

记住:

  • 根据需要输入依赖项(例如,在使用前需要宏定义)。如果不这样做,ASDF 将在加载系统时出错。
  • 列出的所有文件都以 .lisp 结尾,但是这个后缀应该在 asdf 脚本中删除
  • 如果你的系统名称与其 .asd 文件相同,并且你将其文件夹移动(或符号链接)到 quicklisp/local-projects/文件夹,则可以使用 (ql:quickload "example") 加载项目。
  • 你的系统所依赖的库必须为 ASDF(通过 ASDF:*CENTRAL-REGISTRY 变量)或 Quicklisp(通过 QUICKLISP-CLIENT:*LOCAL-PROJECT-DIRECTORIES*变量或其任何 dists 中可用)所知。