(ASDF 3) 是不是可以在子目录中递归加载系统?
Posted
技术标签:
【中文标题】(ASDF 3) 是不是可以在子目录中递归加载系统?【英文标题】:(ASDF 3) Is it possible to recursively load systems in subdirectories?(ASDF 3) 是否可以在子目录中递归加载系统? 【发布时间】:2020-05-18 03:07:58 【问题描述】:我知道使用:module
s,但是当系统嵌套时怎么办?假设我有以下结构,相对于一些未知的用户目录:
foo/
-foo.asd
-bar/
--bar.asd
这可能会出现,例如,在使用 Git 子模块时。我应该如何配置foo.asd
中的(defsystem)
调用以将bar
作为依赖项加载,而不修改foo/
之外的配置文件或要求foo/
树本身的特定位置?感觉应该很简单吧。
2020 年 2 月 3 日:来自 @Svante 的 answer,听起来我的问题实际上是“我如何动态确保 foo/
和 bar/
都进入 *source-registry*
? ASDF manual 让我觉得这应该可以解决问题:
(asdf:initialize-source-registry
'(:source-registry
(:tree "«absolute-path-to-foo»/")
:inherit-configuration))
虽然我没有看到这种用法的例子。
2020 年 3 月 26 日: 上述技术似乎运行良好,所以我要结束这个问题。 ASDF 3 非常出色。
【问题讨论】:
【参考方案1】:ASDF 不关心.asd
文件的相对位置。 ASDF 系统及其依赖项与文件/目录结构完全正交,并且不受任何源版本控制的影响。
它只是在多个位置查找.asd
文件。然后每个这样的文件可能包含系统的定义。它通常会递归到配置的文件夹中,因此通常也会找到 git 子模块中的任何 .asd
文件。
定义,例如。 G。组件,在.asd
文件中,然后从该文件的位置相对工作。
在您的示例中,如果您为"foo"
系统提供:depends-on ("bar")
选项,则无论bar.asd
位于何处(只要它位于ASDF 找到它的位置),它都可以正常工作。
如果您有多个版本的库,则需要更多的认识。如果您同时使用“foo”和“bar”,则可能会发生这种情况,而“bar”的稳定版本也可用,例如。 G。在快速列表中。然后查找顺序开始发挥作用,但通常您的“个人”目录优先于“系统”目录,因此再次正常工作。如需更多控制,您可能需要查看qlot
。
【讨论】:
感谢您的推荐。我的问题似乎在于让 ASDF 首先“找到它”。我是否正确,最简单的方法是调用initialize-source-registry
?我知道过去人们可能会将值推送到*central-registry*
,但现在这种方式已被弃用。
我认为最简单的方法是使用标准位置。例如,我将我的项目放在~/common-lisp/
下。查看 ASDF 手册了解其他标准位置和查找顺序。
当然,这听起来像是最佳实践,而且一点也不 hacky。但是当用作scripting language 时,Lisp 可能无法在构建时间之前确定文件位置。因此,我需要能够使用函数调用。我已经更新了我的原始帖子以显示一个似乎可以工作的表单(?)。以上是关于(ASDF 3) 是不是可以在子目录中递归加载系统?的主要内容,如果未能解决你的问题,请参考以下文章