有没有办法制作一个可配置的ASDF系统,根据用户配置变量加载不同的lisp文件? 优选地,如果未提供所需的配置var,则加载过程将失败并带有清晰的错误消息。 在加载系统时如何方便地设置这些变量? (手动,通过quicklisp或其他系统定义文件)
答案 0 :(得分:2)
不是开箱即用,但你可以安排类似的东西。更改系统加载文件的最简单方法是将#+ / - 与*features*
结合使用。
添加功能的一种方法是在.sbclrc(或你的实现启动文件)中,如果你想要一些更具体项目的东西,你可以定义一个执行:在你的系统上加载操作之前调用一个可以读取文件的函数并且根据其内容,它可以修改*features*
,以便读取不同的组件。我使用这个方案来加载带有配置文件的变量。
所以,如果我的系统是foo
(defsystem #:foo
...
:dependencies (#:foo-config)
...)
(defmethod perform :after ((op load-op)
(system (eql (find-system :foo-config))))
(asdf/package:symbol-call :foo/config-loader 'load-config
(system-relative-pathname :foo-config
#P"foo.config")))
因为#+ / - 在读取时工作,我猜测它不会起作用,因为在读取系统定义后会修改这些功能。一个hacky方法可能只需要配置系统,并在设置功能后使after方法需要系统。
我的2c。
答案 1 :(得分:2)
请不要在defsystem表单中使用#+和# - ,而是:if-feature。
此外,根据功能进行运行时区分或完全具有不同的系统目标要比使目标以构建系统无法看到的不负责任的方式更改其含义要好得多。