我知道使用:module
s,但是当系统嵌套时呢? 假设我有以下结构,相对于一些未知的用户目录:
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
。