温馨提示:本文翻译自stackoverflow.com,查看原文请点击:common lisp - (ASDF 3) Is it possible to recursively load systems in subdirectories?
common-lisp asdf

common lisp - (ASDF 3)是否可以在子目录中递归加载系统?

发布于 2020-04-10 23:48:14

我知道使用:modules,但是什么时候嵌套系统呢?相对于一些未知的用户目录,假设我具有以下结构:

foo/
-foo.asd
-bar/
--bar.asd

例如,在使用Git子模块时,可能会出现这种情况。我应该如何配置(defsystem)调用以foo.asd将其bar作为依赖项加载,而无需foo/foo/树本身之外或不要求对树本身进行特定放置的情况下修改配置文件感觉应该很简单。

2020年2月3日:从@斯万的答案,这听起来像我的问题是真的'如何动态地保证foo/bar/双方进入*source-registry*ASDF手册让我觉得这应该做的伎俩:

(asdf:initialize-source-registry 
  '(:source-registry 
    (:tree "«absolute-path-to-foo»/")
    :inherit-configuration))

尽管我还没有看到这种用法的示例。

2020年3月26日:上面的技术似乎很好用,所以我要解决这个问题。ASDF 3非常好。

查看更多

提问者
Dumaiu
被浏览
55
Svante 2020-02-02 19:27

ASDF不在乎.asd文件的相对位置ASDF系统及其依赖项与文件/目录结构完全正交,而对任何源版本控制均无视。

它只是在几个位置查找.asd文件。然后,每个这样的文件都可以包含系统的定义。通常它将递归到配置的文件夹中,因此.asd通常也可以找到git子模块中的任何文件。

然后,.asd从文件的位置开始相对于文件内部的组件定义进行定义

在您的示例中,如果您给系统提供一个:depends-on ("bar")选项"foo",则无论bar.asd位于何处(只要它在ASDF可以找到的地方),它都可以工作

如果您有多个版本的库,则需要更多的了解。如果您同时使用“ foo”和“ bar”,而又有稳定版本的“ bar”,例如在quicklisp dist中,则可能会发生这种情况。然后,查询顺序开始起作用,但是通常您的“个人”目录优先于“系统”目录,因此同样可以使用要获得更多控制权,您可能需要研究qlot