asdf 找不到包
Posted
技术标签:
【中文标题】asdf 找不到包【英文标题】:asdf can't find package 【发布时间】:2020-05-18 18:34:33 【问题描述】:我正在尝试使用我在此处找到的说明构建一个 Common Lisp 项目:http://turtleware.eu/posts/Tutorial-Working-with-FiveAM.html。我克隆了 repo 并按照文档中的说明进行操作,以便我的 .asd
文件、package.lisp
文件以及我的 tests/package.lisp
和 tests/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
【问题讨论】:
我已经在***.com/a/59981811/31615的第二部分回答了,不是吗? 【参考方案1】:我不喜欢 Fiveam 之类的自动化测试,但您的问题是 :perform
中对符号 foo-tests:all-tests
的引用,该符号位于系统加载后才会存在的包中。使用find-symbol
而不是quote
以下脚本在我的机器上运行完成(我从您帖子中的 sn-ps 开始):
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 运行的函数。
【讨论】:
以上是关于asdf 找不到包的主要内容,如果未能解决你的问题,请参考以下文章
在Python中出现这样的这样,第三方依赖包找不到,怎么解决