Подтвердить что ты не робот

Как лучше структурировать и создавать приложения Clojure с плагинами?

Я думаю (см. ниже), что я хотел бы структурировать проект Clojure как несколько модулей с упорядоченными зависимостями - так же, как Maven позволяет мне делать с многомодульные проекты.

Но я не вижу, как это сделать с Leiningen - все, что я вижу, - это исправление checkouts, описанное в FAQ который не кажется таким сильным.

Будет ли это делать? Должен ли я использовать Gradle вместо этого? Или это не нужно?

Еще какой-то контекст: мне интересно, как создать модульное приложение, поддерживающее плагины (что, я думаю, означает, что jars сбрасывается по пути classpath). И интересно, насколько я могу структурировать это как плагин core + (я думаю, что я должен что-то сделать с Clojure динамической загрузкой кода и не иметь для перехода с Java/OSGi). Поэтому я думаю, что мотивация вождения для одного проекта связана с желанием каким-либо образом упаковать все (плагины ядра + по умолчанию) в виде единого блоба, который легко для конечного пользователя, но который также можно разделить (и который построен и проверены на фрагменты, проверяя логическую независимость каждого модуля). Более общие рекомендации по этому поводу приветствуются

Обновление

Возможное решение, которое не упоминалось ниже, это использовать плагин Maven - я предполагаю, что поддерживает все, что делает Maven, но компилирует Clojure, поэтому будет работать с вложенными модулями и т.д.

4b9b3361

Ответ 1

Во-первых, не похоже, что Leiningen поддерживает иерархию модулей, такую ​​как Maven. Осмотр - это следующая ближайшая вещь. Однако достаточно разработать модульное приложение в Clojure.

Для структуры проекта у меня будет проект API, "основной" проект, сами плагины и отдельный проект упаковки. Ядро и плагины должны зависеть только от API. Какой инструмент построения, который вы используете для создания проекта упаковки, зависит от вас. Gradle, вероятно, будет более эффективным при обработке упаковки, однако наличие функции "проверки" Предложения Leiningen могут облегчить разработку системы в целом.

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

Для динамической загрузки плагинов я начну с поиска, как Noir обрабатывает его в двух своих файлах:

  • server.clj имеет загрузку пространства имен для всех файлов под определенным пространством имен. Под капотом он использует tools.namespace, но вы можете легко увидеть, как он использовал require каждое пространство имен под определенной базой. Таким образом, Leiningen также обрабатывает пользовательские задачи - базовое определение задачи должно быть в пространстве имен leiningen. $Task.
  • core.clj имеет то, что я хотел бы использовать для регистрации плагина. В итоге, используйте карту под atom и добавьте плагины к этой карте. Я бы советовал обернуть регистрацию макросом, чтобы очистить ваш код.

То, что я перечислял выше, должно быть достаточным, если вам не нужно обрабатывать добавление плагинов во время выполнения. Если во время запуска у вас нет каждого плагина на пути к классам, я бы рекомендовал использовать pomegranite для добавления записей в путь к классам. Вы можете увидеть пример в classpath.clj.