我知道使用:module
s,但是什么时候嵌套系统呢?相对于一些未知的用户目录,假设我具有以下结构:
foo/
-foo.asd
-bar/
--bar.asd
例如,在使用Git子模块时,可能会出现这种情况。我应该如何配置(defsystem)
调用以foo.asd
将其bar
作为依赖项加载,而无需foo/
在foo/
树本身之外或不要求对树本身进行特定放置的情况下修改配置文件?感觉应该很简单。
2020年2月3日:从@斯万的答案,这听起来像我的问题是真的'如何动态地保证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
文件。然后,每个这样的文件都可以包含系统的定义。通常它将递归到配置的文件夹中,因此.asd
通常也可以找到git子模块中的任何文件。
然后,.asd
从文件的位置开始相对于文件内部的组件定义进行定义。
在您的示例中,如果您给系统提供一个:depends-on ("bar")
选项"foo"
,则无论bar.asd
位于何处(只要它在ASDF可以找到的地方),它都可以工作。
如果您有多个版本的库,则需要更多的了解。如果您同时使用“ foo”和“ bar”,而又有稳定版本的“ bar”,例如在quicklisp dist中,则可能会发生这种情况。然后,查询顺序开始起作用,但是通常您的“个人”目录优先于“系统”目录,因此同样可以使用。要获得更多控制权,您可能需要研究qlot
。
感谢您的推荐。我的问题似乎在于首先使ASDF“找到它”。我是否认为最不容易破解的方法是调用
initialize-source-registry
?我了解过去可能会将值推给*central-registry*
,但是现在不赞成这种方式。我认为最不容易破解的方法是使用标准位置。
~/common-lisp/
例如,我将项目放在下。查看其他标准位置的ASDF手册和查找顺序。当然,这听起来像是最佳做法,而且一点也不怪异。但是,当用作脚本语言时,Lisp可能无法在构建之前确定文件的位置。因此,我需要能够使用函数调用。我已经更新了原始帖子,以显示一种似乎有效的表单(?)。