You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

服务器运行Common Lisp二进制时ASDF加载失败,如何禁用其自动加载?

如何阻止ASDF在Common Lisp二进制运行时尝试加载不存在的ASDF系统?

问题背景

构建的Common Lisp二进制文件在服务器运行时抛出以下错误:

;; Error while trying to load definition for system asdf from pathname
;; /home/vince/common-lisp/asdf/asdf.asd:
;; couldn't load #P"/home/vince/common-lisp/asdf/asdf.asd": file does not exist.

服务器上不存在/home/vince/common-lisp/目录,尝试过以下方法但均出现新错误:

  • 在.asd文件中直接添加asdf:clear-source-registry和重定义asdf:upgrade-asdf,触发QL-DIST:INSTALLEDP方法不存在错误
  • 使用Shinmera Deploy的钩子,出现相同的QL-DIST错误
  • 手动在服务器创建目录并安装ASDF,引发ASDF/PARSE-DEFSYSTEM:COMPUTE-COMPONENT-CHILDREN重复定义错误

源码运行正常,但需要解决二进制运行时的ASDF加载问题。

解决方案

1. 完善Deploy钩子,覆盖Quicklisp相关方法

之前的钩子仅处理了ASDF,但错误源于Quicklisp的ql-dist:installedp在传入NIL时无对应方法。需在Deploy钩子中同时处理ASDF和Quicklisp的逻辑:

;; 在项目的.asd文件中添加此钩子
(deploy:define-hook (:deploy disable-asdf-ql) (directory)
  (declare (ignorable directory))
  ;; 清空ASDF源注册表,阻止其查找本地系统文件
  #+asdf (asdf:clear-source-registry)
  ;; 禁用ASDF自动升级逻辑
  #+asdf (defun asdf:upgrade-asdf () nil)
  ;; 覆盖ql-dist:installedp,处理传入NIL的情况
  #+quicklisp
  (defmethod ql-dist:installedp ((dist null))
    nil))

该钩子会在二进制部署阶段执行,既阻止ASDF查找本地系统,又修复Quicklisp的方法调用错误。

2. 打包时确保依赖静态绑定

打包前强制加载所有项目依赖,确保所有代码被静态包含到二进制中,避免运行时动态加载:

;; 在Lisp REPL中执行,打包前加载完整依赖
(asdf:load-system :your-project-name :force t)
;; 执行打包
(deploy:deploy-system :your-project-name :output "your-binary-executable")

3. 彻底剥离ASDF/Quicklisp运行时依赖(可选)

如果项目完全不需要运行时动态加载系统的功能,可以在打包时排除ASDF和Quicklisp:

;; 在.asd文件中添加系统钩子,部署前排除ASDF和Quicklisp
(deploy:define-system-hook (:exclude-ql-asdf :before :deploy) (system)
  (declare (ignorable system))
  #+quicklisp (deploy:exclude-system :quicklisp)
  #+asdf (deploy:exclude-system :asdf))

注意:此方法仅适用于无运行时系统加载需求的场景。

错误原因分析

  • 直接在.asd中执行ASDF清理操作时机过早,此时Quicklisp等依赖尚未完成初始化,引发方法调用错误
  • 服务器手动安装ASDF会与二进制中已打包的ASDF版本冲突,导致函数重复定义错误

内容的提问来源于stack exchange,提问作者Ehvince

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 05:26:14