Ответ 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.