Как запустить несколько кольцевых подпроектов с одной лейновой задачи?

У меня есть проект с тремя подобными подпроектами (с использованием 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?

Любые идеи?


person prismofeverything    schedule 10.05.2012    source источник
comment
Что вы пробовали? Я полагаю, что код lein-sub был бы хорошим началом.   -  person Jeremy    schedule 10.05.2012
comment
Я прошел через код, это очень просто. Единственная проблема заключается в том, как я могу предотвратить присоединение процесса к первым двум созданным причалам, но при этом разрешить им работать?   -  person prismofeverything    schedule 11.05.2012
comment
lein sub, похоже, не меняет рабочий каталог, тогда как вы, похоже, используете подмодуль cd; лейн ринг сервер.   -  person HD.    schedule 11.05.2012


Ответы (2)


Это всего лишь предложение, так как я не могу проверить, будет ли это работать прямо сейчас.

Есть переменная в leiningen.core.project, который определяет значения по умолчанию. Может быть, вы могли бы написать плагин (или создать форк lein-sub?) и переопределить эти значения для подпроекта? Затем вы можете создать плагин, который перебирает каждый подпроект, применяя заданную задачу к каждому из них.

Например, по умолчанию исходный путь объявляется так:

:source-paths ["src"]

Затем вы можете переопределить его следующим образом для каждого подпроекта:

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

Сделайте это со всеми соответствующими значениями по умолчанию, и это может сработать.

Возможно, есть способ сделать это с профилями Leiningen 2, но я не уверен. Я предполагаю, что если вы создадите профиль для каждого подпроекта в родительском проекте, вы можете легко объединить профиль при вызове задачи в соответствующем подпроекте.

person Jeremy    schedule 11.05.2012

В итоге я создал метасервер для одновременного запуска всех трех экземпляров причала. Код здесь:

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

person prismofeverything    schedule 19.09.2012