如何让 ASDF 停止尝试加载不存在的文件?

How can you make ASDF stop trying to load a nonexistent file?

在 Debian 上,我在 /usr/lib/sbcl/site-systems 中安装了一堆无法加载的 cruft,因为 FASL 与实际安装的 SBCL 版本不匹配。

出于某种原因,none 这些文件与任何 Debian 软件包相关联(这是一台旧计算机,运行 同一个 Debian 安装已超过十年——它在 Debian Sid 上).

我一次删除了一个坏系统,对于其中的大多数,Quicklisp 做了正确的事情并下载了 Quicklisp 版本。有时,ASDF 会坚持系统应该存在于它以前的路径,但重启 SBCL 就解决了这个问题。

但是对于一个系统,ASDF 一直将其 .asd 文件的位置缓存在 /usr/lib/sbcl/site-systems/ 目录中。加载此系统是不可能的,因为 ASDF 不会查看其他任何地方,即使在重新启动 SBCL 之后也是如此。

我尝试查看 /etc/common-lisp 下各种配置文件中指定的所有路径。 None 这些文件包含对现在丢失的库的引用。

我对 /usr 下的所有文件采取了 grep -rli 操作。我不希望在不到一天的时间内完成,它可能找不到任何东西,在这种情况下,我将被迫 grep 整个硬盘驱动器,这可能需要整整一周的时间。希望缓存没有被压缩,否则我将永远找不到它。

有没有人碰巧知道 ASDF 是如何保存文件路径的?

经过大量的调试,我发现/usr/lib/sbcl/site-systems/中的文件确实存在。它们是损坏的符号链接。

我删除的文件在 similar-looking 路径 /usr/lib/sbcl/site/ 中,符号链接指向该路径。

删除符号链接修复了所有加载错误。

关于排除 Quicklisp 问题的一些想法,特别是当您出现奇怪的行为时。:

  • 如果您长期使用 Quicklisp,您最终可能会使用默认情况下在此处找到的本地包,~/quicklisp/local-projects将您的项目符号链接到该目录是有效的。当然,如果您曾重命名其中一个项目,请不要忘记创建一个新的符号链接并删除旧的

  • 同样,如果您重命名本地项目,同时删除系统索引,Quicklisp 将在下次运行时重新创建该索引:~/quicklisp/local-projects/system-index.txt 时不时删除它也无妨是时候让您的系统保持新鲜了。

  • 您的 *.fasl 文件也可能变得陈旧,删除系统缓存会强制 quicklisp 重新编译所有内容。在 Ubuntu 系统 运行 SBCL 上,这意味着删除以下内容:

rm -rf ~/.cache/common-lisp
  • 尝试更新 Quicklisp 客户端
(ql:update-client)

  • 可能需要在 ~/quicklisp 中删除并重新安装 Quicklisp 本身。 (当您调试和使用 Swanks 查找定义功能时,可能会无意中编辑源文件,从而破坏以前可以正常工作的已安装软件包。并不是说我会做那样粗心的事情。)

  • 此外,不要忘记 ASDF 会下降到目录中寻找 *.asd 文件。如果您有一个结构不当的流浪者,可能会对您的构建系统造成严重破坏。 (请参阅我上面关于将本地项目注册到 Quicklisp 的评论)

  • 最后,不要忘记检查你的 lisp init 文件,例如.sbclrc 用于您可能遗忘的任何调试或快速而肮脏的黑客攻击。

这些都是曾经对我有用过的东西,希望我不是在延续传奇,而且这些问题早已得到解决!