使用 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组件(可选自动+可选延迟处理+按需加载)

VSCode 中自定义 JSX 组件的选项卡快捷方式

对单个文件使用 ASDF 的 :around-compile

React拓展 - setState - 路由组件懒加载 - Hooks - Fragment - Context - PureComponent - 插槽 - 错误边界 - 组件通信方式总结(代码片

reactjs中如何将可选元素作为prop传递给组件

可选组件功能与 SRP