查找包的系统

Finding the system of a package

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

我想象典型的工作流程是这样的:

  1. (ql:quickload :yolo)
  2. (yolo:configure)
  3. 开发者添加远程机器用户和主机等...
  4. 开发者去睡觉了。关闭电脑
  5. 上午:hack hack hack
  6. 是时候部署了。开发人员提交更改并转到 REPL 并键入 (yolo:deploy)

我想要的是让我的库知道开发人员希望根据当前包部署哪个系统。 (*package*)

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

额外问题:是否需要这样的工具?也许有更好的工作流程。我也打算把这个库做成可执行文件,但是默认工程可以通过当前目录获取。

首先,阅读 packagessystemslibrarieshere.

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

一些想法:

我想部署工具会部署一个系统。然后它可能会被明智地定义为 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)

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