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

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

0 голосов
/ 03 февраля 2020

Я пытаюсь создать проект 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

1 Ответ

1 голос
/ 03 февраля 2020

Я не фанат автоматического тестирования, как пять утра, но ваша проблема в ссылке в :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")'

Избегание такого рода символов shenaniganery это боль, и поэтому я не буду касаться механизма тестирования asdf, я просто создаю функции, которые можно запустить из реплея.

...