asdf не может найти пакет

Я пытаюсь создать проект Common Lisp, используя инструкции, которые я нашел здесь: http://turtleware.eu/posts/Tutorial-Working-with-FiveAM.html. Я клонировал репозиторий и следовал инструкциям в документе, чтобы мой файл .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

person jay    schedule 03.02.2020    source источник
comment
Я уже ответил на это во второй части stackoverflow.com/a/59981811/31615, не так ли?   -  person Svante    schedule 03.02.2020


Ответы (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.

person pjstirling    schedule 03.02.2020