我正在尝试使用ECL构建可执行文件。我查看了the doc和其他SO question,我们在那里了解到ECL v< = 16.1.3我们必须添加
(require 'adsf)
然后我将我的项目推送到asdf注册表:
(pushnew "~/projects/my-project/" asdf:*central-registry* :test #'equal)
我加载它:
(load "my-project.asd")
我的程序显然有Quicklisp依赖项。
我将Quicklisp的初始化从我的.sbclrc
复制到~/.eclrc
:
#-quicklisp
(let ((quicklisp-init (merge-pathnames "quicklisp/setup.lisp"
(user-homedir-pathname))))
(when (probe-file quicklisp-init)
(load quicklisp-init)))
所以我可以快速加载我的项目:(此步骤不会出现在文档中,但这样可以找到项目依赖项)
(ql:quickload "my-project")
我也是
(use-package :my-project)
但现在,因为我想用
构建可执行文件(asdf:make-build :my-project
:type :program
:move-here #P"./"
:epilogue-code '(progn (my-project:main)
(si:exit)))
我收到错误
在#<“ASDF / INTERFACE”包中找不到外部符号MAKE-BUILD>。
有人可以帮忙吗?谢谢!
ECL 16.1.3
ps:似乎在REPL中输入重启nb无效。
我的makefile:
ecl-build:
~/.roswell/impls/x86-64/linux/ecl/16.1.3/bin/ecl \
--eval "(require 'asdf)" \
--eval '(format t "--- ASDF version: ~a~&" (asdf:asdf-version))' \
--eval "(pushnew \"~/projets/cl-torrents/\" asdf:*central-registry* :test 'equal)" \
--eval '(load "cl-torrents.asd")' \
--eval '(asdf:make-build :cl-torrents :type :program :move-here #P"./" :epilogue-code "(progn (torrents "matrix") (si:exit))")'
结果:
;;; Loading "/home/vince/quicklisp/setup.lisp"
;;; Loading #P"/home/vince/.roswell/impls/x86-64/linux/ecl/16.1.3/lib/ecl-16.1.3/asdf.fas"
--- ASDF version: 3.2.1
An error occurred during initialization:
Cannot find the external symbol MAKE-BUILD in #<"ASDF/INTERFACE" package>..
Makefile:22: recipe for target 'ecl-build' failed
make: *** [ecl-build] Error 1
现在最简单的路径似乎不确定使用捆绑到ECL中的ASDF,它将具有make-build
命令。
我有一个较新的ASDF版本,因为我将Quicklisp的初始化代码导入~/.eclrc
。我删除它,现在我有ASDF v3.1.8.2,这没关系。但现在,ECL并不知道任何依赖:
组件:未找到DEXADOR,#。
要求
确实,因为不再有Quicklisp了。
ECL doc表示要将所有库路径包含到asdf:*central-registry*
中。偶然,Quicklisp将所有库安装到~/quicklisp/dists/quicklisp/software/
。
首先,我想知道这将如何在以前没有运行Quicklisp的CI管道中运行...
然后我看到只添加这个目录是不够的,Dexador的依赖关系将无法找到,我必须准确添加dexador的目录:
--eval "(pushnew \"~/quicklisp/dists/quicklisp/software/dexador-20170830-git/\" asdf:*central-registry* :test 'equal)" \
所以我真的必须编写代码来包含每个目录吗?
如果Quicklisp之前没有运行一次,如何使这项工作?
更新:使用Roswell安装Ecl:require
asdf,然后我的.eclrc中的所有内容都提供版本3.1.8.2,在Quicklisp初始化3.2.1和make-build
之后符号未知。
使用Debian的Ecl:首先是v2.33.10,然后是v3.2.1。
看起来像死路一条。
11月更新:我等待ASDF 3.3.0的发布以手动更新。这是马车。邮件列表上的消息:等待3.3.1:再次出现错误。
使用lisp-devel Docker镜像,运送ECL 16.1.3。 (我不想在每个VPS上自己编译ECL)。我可以构建一个可执行文件(52Mo的重量),但是出现了运行时错误:
类型的条件:SIMPLE-ERROR &gt;中引用的包((UIOP / STREAM。#))编译文件 零 但尚未创建
答案 0 :(得分:2)
似乎与ASDF和ECL的兼容性问题这在最后一次提交中解决了look here,
在ECL上添加make-build
这提供了与当前ECL的向后兼容性 维护者Daniel K.决定继续支持make-build 接口并为此分配了ASDF。
您可以从此repo
安装/使用最后一个ASDF答案 1 :(得分:1)
您可以使用捆绑的ASDF(这是一个冻结的3.1.7版本,其中一些修补程序被反向移植) - 然后您使用 if ($this->request->is('get')) {
$itemname= $this->request->query('item_name');
$searchitem = $this->MbPriceList->find('all')
->contain(['MbItemList' => function ($q) {
return $q->select(['item_name']);
}])
->select(['MbItemList.item_name', 'id']);
$this->set([
'response' => $searchitem,
'_serialize' => ['response']
]);
}
加载ASDF,或者您可以使用上游3.3版本。
如果您对使用上游ASDF感兴趣,请下载asdf.lisp文件并致电:
(require asdf)
代替(load (compile-file "/path/to/asdf.lisp"))
。
答案 2 :(得分:0)
我看了lisp-devel Docker图片,发送了ECL 16.1.3。 (我不想在每个VPS上自己编译ECL)。我可以构建一个可执行文件(52Mo,重量为VS 78Mo,带有SBCL),因此我能够使用Gitlab CI提供它。
供参考,启动Docker并挂载源:
ql:quickload :closer-mop
不幸的是我遇到了运行时错误:
类型的条件:SIMPLE-ERROR &gt;中引用的包((UIOP / STREAM。#))编译文件 零 但尚未创建
在加载我的应用程序之前,我似乎还必须手动{{1}}。
我不会对此进行调查。