使用ASDF加载可选组件

时间:2019-06-06 19:01:25

标签: common-lisp asdf

如何告诉ASDF仅在组件文件存在的情况下对其进行处理(因此,如果尚不存在则不会生成错误)。

(asdf:defsystem "my-system"
  :components ((:file "utilities")
               (:file "temp-file" :depends-on ("utilities"))))

我的解决方法是使用阅读器宏#。在(probe-file "temp-file")上运行,但无法正常工作。

1 个答案:

答案 0 :(得分: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")))