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

Posted

技术标签:

【中文标题】(ASDF 3) 是不是可以在子目录中递归加载系统?【英文标题】:(ASDF 3) Is it possible to recursively load systems in subdirectories?(ASDF 3) 是否可以在子目录中递归加载系统? 【发布时间】:2020-05-18 03:07:58 【问题描述】:

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

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) 是不是可以在子目录中递归加载系统?的主要内容,如果未能解决你的问题,请参考以下文章

(ASDF 3) 如何将文件|组件标记为“脏”或需要重建?

使用 ASDF 加载可选组件

ASDF 在自定义目录中找不到包

如何从给定路径(包括子目录)递归加载所有符号文件?

如何在 quicklisp 中升级 asdf 版本?

递归加载省市到TreeView