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

Common lisp (ASDF 3)是否可以在子目录中递归加载系统?,common-lisp,asdf,Common Lisp,Asdf,我知道如何使用:modules,但是当系统被嵌套时该怎么办?假设我有以下结构,相对于某个未知的用户目录: foo/ -foo.asd -bar/ --bar.asd 例如,在使用Git子模块时,可能会出现这种情况。如何配置(defsystem)调用foo.asd将条作为依赖项加载,而不修改foo/之外的配置文件或要求对foo/树本身进行特殊放置?感觉应该很简单 2020年2月3日:从@Svante's,听起来我的问题真的是“我如何动态地确保foo/和bar/都进入*源注册表*?”这让我觉得应该

我知道如何使用
:module
s,但是当系统被嵌套时该怎么办?假设我有以下结构,相对于某个未知的用户目录:

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

2020年2月3日:从@Svante's,听起来我的问题真的是“我如何动态地确保
foo/
bar/
都进入
*源注册表*
?”这让我觉得应该做到这一点:

(asdf:初始化源注册表
“(:源注册表
(:tree“«到foo的绝对路径»/”)
:继承配置)
虽然我还没有看到这种用法的例子


2020年3月26日:上述技术似乎很有效,所以我结束这个问题。ASDF 3非常出色。

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

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

定义,e。G对于组件,在
.asd
文件中,从该文件的位置开始相对工作

在您的示例中,如果为
“foo”
系统提供一个
:dependens(“bar”)
选项,则无论
bar.asd
位于何处(只要它位于ASDF找到它的某个地方),它都会工作


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

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

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

定义,e。G对于组件,在
.asd
文件中,从该文件的位置开始相对工作

在您的示例中,如果为
“foo”
系统提供一个
:dependens(“bar”)
选项,则无论
bar.asd
位于何处(只要它位于ASDF找到它的某个地方),它都会工作


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

,谢谢您的推荐。我的问题似乎是首先让ASDF“找到它”。我认为最简单的方法是调用
初始化源注册表
,对吗?我知道过去人们可能会将值推送到
*中央注册表*
,但现在这种方式已不受欢迎。我认为最简单的方法是使用标准位置。例如,我将我的项目放在
~/common lisp/
下。看看ASDF手册中的其他标准位置和查找顺序。当然,这听起来像是最佳实践,一点也不粗糙。但是,当使用Lisp作为一个工具时,它可能无法在构建之前确定文件的位置。因此,我需要能够使用函数调用。我已经更新了我原来的帖子,展示了一个似乎有效的表单(?)。谢谢你的推荐。我的问题似乎是首先让ASDF“找到它”。我认为最简单的方法是调用
初始化源注册表
,对吗?我知道过去人们可能会将值推送到
*中央注册表*
,但现在这种方式已不受欢迎。我认为最简单的方法是使用标准位置。例如,我将我的项目放在
~/common lisp/
下。看看ASDF手册中的其他标准位置和查找顺序。当然,这听起来像是最佳实践,一点也不粗糙。但是,当使用Lisp作为一个工具时,它可能无法在构建之前确定文件的位置。因此,我需要能够使用函数调用。我已经更新了我原来的帖子,以显示一个似乎有效的表单(?)。