这就是我为解决这个问题所做的。它可能不是您所需要的,但这里可能有一些可以提供帮助的想法。
用于开发
确保您尝试构建的系统只有一个副本。因此,特别要确保没有 ASDF 可能找到的已安装副本:见下文。
那么这将起作用。首先确保您的 ASDF 系统定义是可冷加载的,因此特别要确保它的顶部有正确的(in-package :asdf-user)。
那么构建系统的方法是:
$ cd .../my-project
$ sbcl
[...]
* (require :asdf) ;already loaded in my case by init files
nil
* (load "my-project.asd")
t
* (asdf:load-system "my-project")
; compiling file "/media/psf/share/tmp/my-project/package.lisp" (written 15 DEC 2020 09:06:54 AM):
; processing (defpackage :com.example ...)
[...]
*
现在你很好了。所以我做的三个技巧是:
- 根本避免考虑整个源注册表头发,因为如果你想太多,触手会撕掉你的脸(我知道,它发生在我身上,我现在没有脸);
- 确保系统只有一份副本,这样 ASDF 就不能使用源注册表头发我避免考虑找到错误的;
- 显式加载系统定义文件 - 无论 ASDF 在哪里查找,它至少会在与该目录相同的目录中查找。
用于生产
答案是Quicklisp。做任何需要让 Quicklisp 安装在你的 Lisp 中。然后你需要知道它的安装目录在哪里:有一些默认值,但我从不使用它,因为我对文件系统应该是什么样子有自己的概念。
那么诀窍是 Quicklisp 将在其local-projects 目录下查找、构建和加载系统(据我所知,Quicklisp 完全由能力和魔法组成)。因此,如果您在那里放置一个系统,那么 Quicklisp 将简单而优雅地处理将其放入运行映像中。
要进行此安装...我有生成文件。我知道,我应该使用 Lisp 工具,但我生活在 *nix 平台上,make 和 install 擅长整个复制文件位。
Makefile 的相关部分(实际上这就是全部)是:
# Where Quicklisp lives, and the name of this project using slashes
QUICKLISP = /local/tfb/packages/quicklisp
THIS = org/tfeb/sample
FASLS = *fasl *fsl
.PHONY: install uninstall clean
# To install the project make its directory, copy all the sources and
# the sysdcl into it, and then nuke Quicklisp's cache file so it searches
# next time
#
install:
@mkdir -p "$(QUICKLISP)/local-projects/$(THIS)"
@cd "$(QUICKLISP)/local-projects/$(THIS)" && rm -f $(FASLS)
@install -C -v -m 444 *.lisp *.asd "$(QUICKLISP)/local-projects/$(THIS)"
@rm -f "$(QUICKLISP)/local-projects/system-index.txt"
# To uninstall the project just nuke the directory and the cache
#
uninstall:
@rm -rf "$(QUICKLISP)/local-projects/$(THIS)"
@rm -f "$(QUICKLISP)/local-projects/system-index.txt"
clean:
@rm -f $(FASLS) *~
这里有四件有趣的事情:
- 我只是将
make 用作文件复制机——它不会编译任何东西或类似的东西,而且完全可以使用脚本;
- 您需要清除 Quicklisp 的缓存文件,以便它在启动时再次搜索;
- 我禁用了 ASDF 的输出翻译,这就是我花时间清理已编译文件的原因 - 安装后,项目总是应该从冷态重建;
-
uninstall 目标是您在开发之前需要运行的目标 - 它会破坏已安装的版本,因此 ASDF 找不到它。
在项目目录中运行合适的make install 后,(ql:quickload :org.tfeb.sample) 将为您编译和加载它。
请注意,另一种方法(由 Ehvince 在评论中建议)是将 Quicklisp 的 local-projects 目录下的符号链接保留回代码的规范版本。我不这样做,但它会工作得很好,并且在某些方面可能会更好。