asdf找不到软件包

时间:2020-02-03 00:23:57

标签: common-lisp asdf

我正在尝试使用在这里找到的说明http://turtleware.eu/posts/Tutorial-Working-with-FiveAM.html来搭建Common Lisp项目。我克隆了存储库,并按照文档中的说明进行了操作,以使我的.asd文件,package.lisp文件以及tests/package.lisptests/main.lisp文件都与该说明匹配。我运行了(asdf:test-system 'quasirpg),一切正常。

我将此示例项目复制到我的真实工作文件夹中,并进行了搜索和替换,以将quasirpg的所有实例更改为foo。我运行了(asdf:test-system 'foo),REPL给我一个错误,找不到软件包“ FOO-TESTS”。

现在,我重新运行了(asdf:test-system 'quasirpg),该方法以前已经工作过,REPL给了我同样的错误,即找不到“ QUASIRPG-TESTS”软件包。

任何人都可以解释一下这里发生了什么以及如何让我的asdf程序包管理器查找测试程序包吗?


Thank you.
;;;; foo.asd

(asdf:defsystem #:foo
  :description "Part of the FiveAM tutorial"
  :author "Tomek 'uint' Kurcz"
  :license "GPLv3"
  :serial t
  :components ((:file "package")
               (:file "foo"))
  :in-order-to ((test-op (test-op "foo/tests"))))

(asdf:defsystem #:foo/tests
  :depends-on (:foo :fiveam)
  :components ((:module "tests"
                :serial t
                :components ((:file "package")
                             (:file "main"))))
  :perform (test-op (o s)
                    (uiop:symbol-call :fiveam :run! 'foo-tests:all-tests)))


;;;; tests/package.lisp

(defpackage #:foo-tests
  (:use :cl :fiveam)
  (:export #:run! #:all-tests))

;;;; tests/main.lisp

(in-package #:foo-tests)

(def-suite all-tests
  :description "The master suite of all foo tests.")

  ;; tests continue below

1 个答案:

答案 0 :(得分:1)

我不喜欢Fiveam等自动测试的爱好者,但是您的问题是:perform中对符号foo-tests:all-tests的引用,该符号在系统中才会存在已加载。使用find-symbol代替quote

以下脚本在我的计算机上运行完毕(我从您的帖子中的片段开始):

DIR=~/quicklisp/local-projects/foo
mkdir $DIR
cd $DIR
cat >foo.asd <<EOF
(asdf:defsystem #:foo
  :description "Part of the FiveAM tutorial"
  :author "Tomek 'uint' Kurcz"
  :license "GPLv3"
  :serial t
  :components ((:file "package")
               (:file "foo"))
  :in-order-to ((test-op (test-op "foo/tests"))))

(asdf:defsystem #:foo/tests
  :depends-on (:foo :fiveam)
  :components ((:module "tests"
                :serial t
                :components ((:file "package")
                             (:file "main"))))
  :perform (test-op (o s)
                    (uiop:symbol-call :fiveam
                      :run!
                                      (find-symbol "ALL-TESTS"
                                   "FOO"))))

EOF

touch package.lisp
touch foo.lisp

mkdir tests

cat >tests/package.lisp <<EOF
(defpackage #:foo-tests
  (:use :cl :fiveam)
  (:export #:run! #:all-tests))

EOF

cat >tests.main.lisp <<EOF
(in-package #:foo-tests)

(def-suite all-tests
  :description "The master suite of all foo tests.")
EOF

sbcl --eval '(asdf:load-system "foo")'

避免这种象征意义的痛苦是痛苦的,为什么我通常不会接触asdf测试设备,我只是创建可以从repl运行的功能。