common-lisp - (ASDF 3) 是否可以在子目录中递归加载系统?
问题描述
我知道使用:module
s,但是当系统嵌套时呢?假设我有以下结构,相对于一些未知的用户目录:
foo/
-foo.asd
-bar/
--bar.asd
例如,在使用 Git 子模块时可能会出现这种情况。我应该如何配置(defsystem)
调用foo.asd
以加载bar
为依赖项,而无需修改外部的配置文件foo/
或要求foo/
树本身的特定位置?感觉应该很简单。
2020 年 2 月 3 日:从@Svante 的回答看来,我的问题实际上是“我如何动态确保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
.
推荐阅读
- python-3.x - 如何更改 H2O GBM 和 DRF 中的预测
- javascript - 正则表达式准确找到 4 位数字
- ruby-on-rails - Rails ajax ActionController::Parameters allowed: false
- nginx - 在插件 'rate-limiting' 中使用 'X-Forwarded-For' 而不是 '$remote_ip'
- java - 尝试在 Head First Servlets 和 JSP 中重现示例时出现 NullPointerException
- c# - 控制台应用程序启动另一个进程环境变量不可访问
- events - READ 和 WRITE 的通用服务 - CQRS + DDD
- c++ - 仅在一定限度内释放 2D 指针数组的内存
- asp.net-mvc - 如何将我的发布方法分配给视图中的按钮
- android - 如何在设计评审中显示标题栏?