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



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

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

例如,在使用 Git 子模块时,可能会出现这种情况。 我应该如何在foo.asd中配置(defsystem)调用以将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非常好。

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

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

然后,.asd文件内部的定义(例如组件(从该文件的位置相对工作。

在您的示例中,如果您为"foo"系统提供:depends-on ("bar")选项,无论bar.asd驻留在何处(只要它是 ASDF 找到它的地方(,它都可以正常工作。

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

最新更新