如何使用单个 lein 任务启动多个环形子项目



我有一个项目,有三个这样的子项目(使用 lein-sub):

(defproject trident "0.1.0"
  ...
  :sub
  ["admin"
   "api"
   "site"])

每个内部都有一个环形处理程序,如下所示:

(defproject trident-api "0.1.0-SNAPSHOT"
  ...
  :ring {:handler trident.api.core/handler
         :servlet-name "trident-api"
         :init trident.api.core/init
         :port 33333})

现在我进入每个并输入:

> lein ring server

这显然令人厌烦。 我也试过

> lein sub ring server

这似乎应该有效,但它只启动第一个并且进程加入它! 可能有办法解决这个问题? 这似乎是最简单的方法。

取而代之的是,我现在正在编写一个leiningen任务来为我做这件事,但遇到了一些问题。 我可以使用leiningen.core.project/read轻松获取每个环形服务器的项目文件,但是从这里开始,如何以尊重其各自project.clj文件中的所有依赖项和其他设置的方式启动每个环形服务器?

有什么想法吗?

这只是一个建议,因为我无法验证这现在是否有效。

leiningen.core.project中有一个 var 用于标识默认值。也许你可以写一个插件(或fork lein-sub?)并让它覆盖子项目的这些值?然后,您可以创建一个插件,该插件在将给定任务应用于每个子项目的同时遍历每个子项目。

例如,默认值声明源路径,如下所示:

:source-paths ["src"]

然后,您可以为每个子项目使用以下内容覆盖它:

:source-paths ["sub-project/src"]

使用所有相关的默认值执行此操作,它可能会起作用。

也许有一种方法可以用Leiningen 2的个人资料做到这一点,但我不确定。我想如果您为父项目中的每个子项目创建一个配置文件,您可以在调用相应子项目上的任务时轻松合并配置文件。

我最终构建了一个元服务器来同时启动所有三个码头实例。 代码在这里:

https://github.com/antler/lein-caribou/blob/master/src/leiningen/caribou/server.clj