我正在尝试使用asdf的功能从repl运行我的测试套件,但是当使用quicklisps quickload时,如果在第一次尝试加载foo时失败并在第二次尝试成功。
(in-package :cl-user)
(defpackage :foo-system
(:use :cl :asdf))
(in-package :foo-system)
(asdf:defsystem :foo
:components ((:file "foo")))
(asdf:defsystem :foo-tests
:depends-on (:foo)
:components ((:file "foo-tests")))
(defmethod asdf:perform ((op test-op) (system (eql (find-system :foo))))
(asdf:load-system 'foo-tests)
(foo-tests:run-tests))
这是有道理的,因为当我编译asd文件时,错误似乎是asdf:perfom defmethod的第二种形式。用foo替换nclack的错误是:
../../ nclack / nclack.asd:36:27:读取错误: COMPILE-FILE期间读取错误:
Package NCLACK-TESTS does not exist. Line: 36, Column: 27, File-Position: 1034 Stream: #<SB-SYS:FD-STREAM for "file /Users/PuercoPop/quicklisp/local-projects/nclack/nclack.asd" {1005DB11A3}>
匹配(foo-tests:run-tests)行。所以似乎“加载”系统与编译其形式不同?或者为什么在加载系统后没有定义包?有任何想法吗?我很茫然。
答案 0 :(得分:3)
当你compile-file
时:
(defmethod asdf:perform ((op test-op) (system (eql (find-system :foo))))
(asdf:load-system 'foo-tests)
(foo-tests:run-tests))
第一步是read
整个表格。 Read
包括发现的所有符号的实习。但是,在读取时,表单尚未执行,因此尚未加载系统foo-tests
。由于该系统包含包foo-tests
,并且尚未加载,因此您无法在此表单的读取时将任何符号实施到该包中。
这就是compile-file
在尝试read
表单时显示错误的原因。
在我看来,你需要(funcall (find-symbol "RUN-TESTS" #:foo-tests))
。
答案 1 :(得分:0)
首先:
如果你定义一个新包FOO-SYSTEM
而使用包ASDF
,然后使用仍然带有前缀的asdf符号,那么你就打败了使用包。为什么要使用它,当你为符号加前缀?
很难说错误是什么,因为我们没有看到回溯并且看不到文件。
无论如何,您需要确保在编译文件期间可以使用包。例如,编译DEFPACKAGE
表单可能不会更改编译时环境。您需要执行DEFPACKAGE
表单。您还需要确保在加载系统操作期间加载包定义。
如果包不存在,您需要确保它存在。