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.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

【问题讨论】:

我已经在***.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 找不到包的主要内容,如果未能解决你的问题,请参考以下文章

android studio导jar包找不到类的解决方法

在Python中出现这样的这样,第三方依赖包找不到,怎么解决

jdk1.8中java.sql.Driver包找不到的解决

Wireshark抓包找不到接口

SpringBoot项目使用common模块问题(依赖包找不到?)

Maven json包找不到解决办法