【问题标题】:(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 非常出色。

【问题讨论】:

    标签: common-lisp asdf


    【解决方案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 可能无法在构建时间之前确定文件位置。因此,我需要能够使用函数调用。我已经更新了我的原始帖子以显示一个似乎可以工作的表单(?)。
    猜你喜欢
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多