使用 ASDF 加载可选组件
Posted
技术标签:
【中文标题】使用 ASDF 加载可选组件【英文标题】:Loading an Optional Component with ASDF 【发布时间】:2019-10-22 07:52:33 【问题描述】:如何告诉 ASDF 仅在组件文件存在时才对其进行处理(因此,如果组件文件尚不存在,则不会生成错误)。
(asdf:defsystem "my-system"
:components ((:file "utilities")
(:file "temp-file" :depends-on ("utilities"))))
我的解决方法是使用阅读器宏#。在(probe-file "temp-file")
上,但无法使其正常工作。
【问题讨论】:
This looks somewhat promising。不知道它是否做你想要的,所以不要把它作为答案。你为什么要这样做呢? 是的,这看起来像是在生成源文件,我个人认为这是一种反模式。你到底想达到什么目的? 有时绕过编译和加载问题规范文件是为了方便开发。我想我可以创建一个虚拟规范,但认为只检查规范文件是否存在会更容易。 如果您的目标是阻止文件,为什么不在文件内容周围使用#|...code...|#
注释语法? ASDF 会在加载“空”(根据 lisp 阅读器)文件时成功。
【参考方案1】:
我认为您真正想要做的是让 ASDF 只是警告您而不是在编译错误期间启动调试器。更改*compile-file-warnings-behaviour*
和*compile-file-failure-behaviour*
,并阅读手册中的the section on error handling。
这个答案的其余部分是如何检查整个系统。您可以将可能加载文件打包到他们自己的系统中,并在下面这样做。
来自ASDF Manual section 6.3.8。
6.3.8 弱依赖
我们不建议您使用此功能。
所以无论如何你都可以使用它。像这样:
(defpackage :foo-system
(:use :cl :asdf))
(in-package :foo-system)
(defsystem foo
:description "The main package that maybe loads bar if it exists."
:weakly-depends-on (:bar)
:components ((:file "foo")))
简单吧?
这是他们的推荐:
如果您想编写一个弱依赖于 系统栏,我们建议您改为将系统 foo 写入 参数方式,并提供一些特殊的变量和/或一些挂钩 专门化其行为;那么你应该写一个系统 foo+bar 将事物连接在一起。
我从来没有在野外见过其中的一个,可能是因为这样做会造成可怕的混乱。
(defpackage :bar-system
(:use :cl :asdf))
(in-package :bar-system)
(defsystem bar
:description "The package that maybe exists and is needed by foo."
:components ((:file "bar")))
(defpackage :foo+bar-system
(:use :cl :asdf))
(in-package :foo+bar-system)
(defsystem foo+bar
:version "0.1.0"
:description "Hook together foo and bar."
:author "Spenser Truex <web@spensertruex.com>"
:serial t
:components ((:file "foo+bar")))
(defpackage :foo-system
(:use :cl :asdf))
(in-package :foo-system)
(defsystem foo
:description "The main package that maybe loads bar if it exists."
:depends-on (:foo+bar)
:components ((:file "foo")))
【讨论】:
以上是关于使用 ASDF 加载可选组件的主要内容,如果未能解决你的问题,请参考以下文章
jQuery封装的tab组件(可选自动+可选延迟处理+按需加载)
对单个文件使用 ASDF 的 :around-compile
React拓展 - setState - 路由组件懒加载 - Hooks - Fragment - Context - PureComponent - 插槽 - 错误边界 - 组件通信方式总结(代码片