Динамически загружать зависимости в Clojure REPL

#maven #clojure #read-eval-print-loop #leiningen

#maven #clojure #чтение-оценка-печать-цикл #leiningen

Вопрос:

Возможно ли загрузить и установить ранее неуказанные зависимости Maven в запущенном Clojure REPL?

Я имею в виду довольно распространенный случай, когда вы хотите быстро временно подключить зависимость для некоторых инструментов тестирования или визуализации, но не хотите закрывать текущий сеанс REPL.

Например, если вы хотите использовать Incanter для рисования некоторых красивых диаграмм данных в текущем сеансе REPL, вы можете использовать что-то вроде следующего:

 (load-dependency "incanter" "incanter" "1.3.0-SNAPSHOT")

;; now do stuff with Incanter......
  

Предположительно, вам придется запускать разрешение / загрузку зависимостей в Maven или Leiningen из соответствующего репозитория, но я недостаточно знаю об их внутренностях, чтобы знать, возможно ли это или нет во время выполнения…..

Комментарии:

1. Есть еще один способ сделать это в работе: insideclojure.org/2018/05/04/add-lib По состоянию на 2019-06-07 он находится в ветке, которая еще не была объединена ( github.com/clojure/tools.deps.alpha/compare/add-lib ).

Ответ №1:

Поведение загрузчика классов Java по умолчанию затрудняет это, но pomegrenade (на самом деле, pomegranate) утверждает, что может делать то, что вы хотите.

Комментарии:

1. потрясающе — похоже, это идеально подходит! достаточно забавно, что пример Incanter тот же, что и в документации pomegrenade 🙂

2. @mikera Вам определенно повезло, эта библиотека была выпущена около 5 дней назад disclojure.org/2011/10/05/today-in-the-intertweets-oct-5th-ed-3 .

3. Я замечаю, что URL-адрес написан правильно (pomegranate), но ссылка представляет собой довольно смешную помагренаду. Интересно, это какая-то странная шутка, ориентированная на гранаты, которую я не понимаю?

4. ха-ха. Я думаю, что это была моя орфографическая ошибка. Глупая ошибка с моей стороны. Хотя granate и grenade — это одно и то же слово; просто первое — французское, а второе — английское (pommegranate транслитерируется как grenade apple). Я поместил аннотацию в исходное сообщение, чтобы исправить свою ошибку

5. Небольшая вставка здесь, если вы хотите использовать полностью основанную на clojure систему зависимостей, github.com/bmillare/dj поддерживает зависимости загрузки во время выполнения. Кроме того, поддерживается динамическая загрузка собственных зависимостей.

Ответ №2:

Alembic — это плагин leiningen, который добавляет эту функциональность в repl.

Прямая цитата из README:

Alembic — это библиотека clojure, которая позволяет вам перегонять jar-файлы в ваш classpath в запущенном экземпляре JVM. Вы можете использовать его для добавления зависимостей к запущенному REPL либо одноранговым способом, либо путем перезагрузки вашего файла project.clj.

Он также добавляет (load-project) функцию, которая анализирует project.clj и добавляет недостающие зависимости на лету.