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

(ASDF 3) Is it possible to recursively load systems in subdirectories?

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

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

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

2020 年 2 月 3 日: 来自@Svante 的 , it sounds like my question is really 'How do I dynamically ensure that foo/ and bar/ both get into the *source-registry*?' The ASDF manual 让我认为这应该可以解决问题:

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

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

2020 年 3 月 26 日: 上面的技术似乎工作正常,所以我要关闭这个问题。 ASDF 3 非常棒。

ASDF 不关心 .asd 文件的相对位置。 ASDF 系统及其依赖项与 file/directory 结构完全正交,并且不受任何源版本控制的影响。

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

定义,e。 G。 .asd 文件内的组件然后从该文件的位置相对工作。

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

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