首页 > 解决方案 > (ASDF 3) 是否可以在子目录中递归加载系统?

问题描述

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

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

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

2020 年 2 月 3 日:从@Svante 的回答看来,我的问题实际上是“我如何动态确保foo/两者bar/都进入*source-registry*?” ASDF手册让我认为这应该可以解决问题:

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

虽然我还没有看到这种用法的例子。

2020 年 3 月 26 日:上述技术似乎运行良好,所以我要结束这个问题。ASDF 3 非常出色。

标签: common-lispasdf

解决方案


ASDF 不关心.asd文件的相对位置。ASDF 系统及其依赖项与文件/目录结构完全正交,并且忽略了任何源版本控制。

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

然后,文件内部的定义(例如组件的定义).asd相对于该文件的位置起作用。

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

如果您有多个版本的库,则需要更多的意识。如果您同时处理“foo”和“bar”,则可能会发生这种情况,而“bar”的稳定版本也可用,例如在 quicklisp dist 中。然后查找顺序开始发挥作用,但通常您的“个人”目录优先于“系统”目录,所以再一次,它就可以工作了。要获得更多控制,您可能需要查看qlot.


推荐阅读