Common lisp ASDF系统配置变量?

Common lisp ASDF系统配置变量?,common-lisp,asdf,Common Lisp,Asdf,有没有一种方法可以使可配置的ASDF系统根据用户配置变量加载不同的lisp文件? 最好是,如果没有提供所需的配置变量,加载过程将失败,并显示清晰的错误消息。 加载系统时,如何方便地设置这些变量?手动,通过quicklisp,或从另一个系统定义文件不是现成的,但您可以安排类似的内容。更改系统加载的文件的最简单方法是将+/-与*功能*结合使用 添加功能的一种方法是在.sbclrc或您的实现启动文件中。如果您想要更特定于项目的内容,您可以在系统上定义一个perform:在加载op之前,它将调用一个函数

有没有一种方法可以使可配置的ASDF系统根据用户配置变量加载不同的lisp文件? 最好是,如果没有提供所需的配置变量,加载过程将失败,并显示清晰的错误消息。
加载系统时,如何方便地设置这些变量?手动,通过quicklisp,或从另一个系统定义文件

不是现成的,但您可以安排类似的内容。更改系统加载的文件的最简单方法是将+/-与*功能*结合使用

添加功能的一种方法是在.sbclrc或您的实现启动文件中。如果您想要更特定于项目的内容,您可以在系统上定义一个perform:在加载op之前,它将调用一个函数来读取文件,并根据其内容修改*功能*,以便读取不同的组件。我使用此方案加载配置文件中的变量

所以如果我的系统是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")))
因为+/-在读取时起作用,我猜它不会起作用,因为在读取系统定义后会修改特性。解决这一问题的一种方法可能是只需要配置系统,并在设置特性后使after方法需要系统


我的2c。

不是现成的,但你可以安排类似的事情。更改系统加载的文件的最简单方法是将+/-与*功能*结合使用

添加功能的一种方法是在.sbclrc或您的实现启动文件中。如果您想要更特定于项目的内容,您可以在系统上定义一个perform:在加载op之前,它将调用一个函数来读取文件,并根据其内容修改*功能*,以便读取不同的组件。我使用此方案加载配置文件中的变量

所以如果我的系统是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")))
因为+/-在读取时起作用,我猜它不会起作用,因为在读取系统定义后会修改特性。解决这一问题的一种方法可能是只需要配置系统,并在设置特性后使after方法需要系统


My 2c.

请不要在defsystem表单中使用+和-,而是使用:if功能


此外,根据功能进行运行时区分或使用不同的系统目标比使用目标以构建系统无法看到的无法解释的方式更改其含义要好得多。

请不要在defsystem表单中使用+和-,而是:if功能


此外,更好的做法是根据功能进行运行时差异化或使用完全不同的系统目标,而不是让目标以构建系统看不到的无法解释的方式更改其含义。

不知道:如果是功能,我想我应该rtfm一个days@Faré,您能否详细说明一下,以构建系统看不到的方式更改目标是什么意思?你的意思是用新的配置变量重新加载系统会导致所需的文件无法编译吗?因为似乎没有一种干净安全的方法来进行编译,而且在我的例子中只有一个变量,所以我同意你的建议,使用两个不同的系统定义。我不知道:if-feature,我想我应该试试这个days@Far那么,您能否详细说明一下,以构建系统看不到的方式更改目标是什么意思?你的意思是用新的配置变量重新加载系统会导致所需的文件无法编译吗?因为似乎没有一种干净安全的方法来完成这项工作,而且在我的例子中只有一个变量,所以我同意你的建议,使用两个不同的系统定义。