在 quicklisp 项目上使用 buildapp 时如何修复 asdf 错误

How to fix asdf error when using buildapp on a quicklisp project

我最近一直在做我的第一个 quicklisp 项目,我想分享它。我已经将 it 放在 github 上,但并不是每个人都安装了 emacs + slime + quicklisp,所以我想制作一个可以与代码一起放置的可执行文件。

为此,我使用 buildapp 并按照 this Whosebug 答案中列出的步骤进行操作。

$ sbcl --no-userinit --no-sysinit --non-interactive \
       --load ~/quicklisp/setup.lisp \
       --eval '(ql:quickload "ltk-colorpicker")' \
       --eval '(ql:write-asdf-manifest-file "quicklisp-manifest.txt")'

$ buildapp --output out \
           --manifest-file quicklisp-manifest.txt \
           --load-system ltk-colorpicker \
           --entry colorpicker

在 运行 这些命令之后,我得到以下错误:

Fatal INPUT-ERROR-IN-LOAD:
  READ error during LOAD:

    The symbol "*SYSTEM-DEFINITION-SEARCH-FUNCTIONS*" is not external in the ASDF/FIND-SYSTEM package.

      Line: 16, Column: 90, File-Position: 15267

      Stream: #<SB-INT:FORM-TRACKING-STREAM for "file /home/nathan/quicklisp/local-projects/ltk-colorpicker/dumper-2SKVI5f7.lisp" {1001B70F83}>

这里的主要问题是我什至不知道如何开始修复它。我见过 this gibhub 问题,但这与 Homebrew 的问题有关,它甚至从未提及 buildapp。这一切都非常混乱。我希望我能得到一些帮助。

提前感谢您的回答。

我可以重现错误。正如评论中所建议的,您可以按如下方式构建 buildapp 的最新版本:

$ sbcl
* (ql:quickload :buildapp)
...

* (buildapp:build-buildapp 
    (merge-pathnames "bin/buildapp" (user-homedir-pathname)))

此版本 $HOME/bin/buildapp。当我使用新的二进制文件时,没有错误了。

您还可以通过系统地调用 Common Lisp 中的 buildapp::main 函数来避免生成可执行文件(最终可能会过时);然后你将始终拥有与当前 quicklisp 版本相对应的版本:

* (buildapp::main 
    '("BUILDAPP" ;; argv[0] must exist but the value is not important
      "--manifest-file" "/tmp/quicklisp-manifest.txt" 
      "--load-system" "drakma" "--output" "/tmp/test"))

我的一些额外信息:

解决方案是使用@coredump 提到的最新版本的buildapp。我通过转到 github page、下载 zip 并在存储 buildapp 的位置执行以下命令进行了更新。

$ make
$ cp buildapp /usr/bin

(这当然只适用于 linux。) 这不是一个优雅的解决方案,但是 buildapp 已经 4 年没有更新了,我认为这是一个足够安全的选择。我也犯了一个错误的命令。 --entry 部分是错误的。它应该是:`--entry ltk-colorpicker::main`` 其中 main 是一个接受一个变量的函数,因为 spec.

需要它

主要就是这样:(main (i) (declare (ignore i)) (colorpicker))