找到一个包的系统

时间:2017-01-05 10:31:00

标签: common-lisp asdf

我正处于为CL项目构建部署工具的设计阶段。

我认为典型的工作流程是这样的:

  1. (ql:quickload :yolo)
  2. (yolo:configure)
  3. 开发人员添加远程计算机用户和主机等...
  4. 开发者上床睡觉。关闭电脑
  5. 早上:hack hack hack
  6. 部署时间。开发人员提交更改并转到REPL并键入 (yolo:deploy)
  7. 我想要的是让我的库知道开发人员想要基于当前包部署哪个系统。 (*package*

    我的问题:是否有可能找到加载特定包的系统?当然我在谈论ASDF

    奖金问题:是否需要这样的工具?也许有更好的工作流程。我还计划使库成为可执行文件,但是可以通过当前目录获取默认项目。

2 个答案:

答案 0 :(得分:2)

首先,阅读系统图书馆here

我认为推断预期系统没有多大意义。无论如何,您至少需要一个额外的参数(目标 要部署)。

一些想法:

我认为部署工具会部署系统。然后,它可能明智地被定义为ASDF的延伸。

例如,您可以设计这样的扩展名,以便您可以在defsystem表单中指定部署配置,如下所示:

(defsystem #:foo
  :defsystem-depends-on (#:your-awesome-asdf-deploy)
  ;; ...
  :deploy-targets (:test (:host "test.example.org"
                          :user "foo"
                          :env (:backend-url "https://test.foo.org/api"
                                :dev t))
                   :prod (:host "prod.example.org"
                          :user "bar"
                          :env (:backend-url "https://foo.org/api"
                                :dev nil))))

然后可以在新的 op deploy-op中使用此信息,您可以调用它:

(asdf:oos 'asdf-deploy:deploy-op 'foo :target :test)

答案 1 :(得分:1)

没有内置的方法来回答你的问题,但是如果在你加载asdf之后,你挂钩(defmethod perform :after ((o load-op) (s system)) ...)一个函数来区分所有包列表中的新条目列表,那么你可以构建系统创建哪些包的索引。