В чем разница между том и Лейнингеном?
Вопрос
В чем разница между том и Лейнингеном?
Решение
Этот ответ продолжает получать интерес, предполагаемо, по-видимому, в качестве ссылки на Leiningen в StackoverFlow, поэтому он теперь значительно отредактирован для обновления его на 2014 год.
Ленинген и торт, объединенные в 2011 году. Leinhen (версия 2) теперь является инструментом автоматизации Clojure DE FACTO.
ЛейбинаЯвляется ли инструмент сборки и диспетчеризации зависимостей для Clojure, который включает в себя возможность настроить интерактивную замену с соответствующим настроенным классовым патком и со всеми зависимостями Java и Clojure, приобретенные в автоматизированном виде от репозиториев Maven и / или сообщества на основе Clojars..
Торт был очень похожим на Leinceen (вниз, чтобы использовать тот же формат файла Project.clj в то время), но попытался избежать большого количества запуска наверху, сохраняя стойкие JVM на заднем плане. Это было более отзывчивым, но торгуемым удобством для ошибок из-за накопленного состояния в постоянных процессах (определения старых функций, висящие вокруг и т. Д.) На типичное течение развития итеративного раскрытия. Это оказалось плохой сделкой.
Опыт работы с Лейнингеном и постоянным желанием на более быстрое время запуска привести к ряду рекомендаций и подходов для ускорения вещей: https://github.com/technomancy/leiningen/wiki/faster.
Другие советы
Основное отличие в том, как задачи реализованы.
Подход торта - «Трудно расширить функции после того, как они были определены, поэтому давайте изобрем новый механизм для задач, а не использовать функции», что привело к макросу Deftask.
Подход Лейнингена является «трудно расширить функции после того, как они были определены, поэтому мы должны сделать способ сделать это легко; то, что мы можем использовать функции для задач, а также иметь возможность расширить вещи, которые не являются задачами», которые Позволяет применить все преимущества композиции функций с задачами.
Как упоминалось Алекс, самая поразительная разница скорость из командной строки. Торт использует постоянную JVM, поэтому вы столкнулись только на запусках JVM наверху, когда вы впервые запускаете задачу в вашем проекте. Если вы не используете EMACS + Slime + Clojure-Test-Mode-Mode, это может быть огромным развесом. Например, достаточно большой набор тестов на одном из моих проектов запускается за 0,3 секунды в торт, против 11,2с в Лейне.
Помимо производительности, основная идея за том - модель задач зависимости. Каждая задача выполняется только один раз в данной сборке, принимая во внимание все переходные предпосылки в графике зависимости. Вот пример из Статья Мартина Фаулера о граблях В торт синтаксис, который идет прямо в вашем Project.clj.
(deftask code-gen
"This task generates code. It has no dependencies."
(println "generating code...")
...)
(deftask compile #{code-gen}
"This task does the compilation. It depends on code-gen."
(println "compiling...")
...)
(deftask data-load #{code-gen}
"This task loads the test data. It depends on code-gen."
(println "loading test data...")
...)
(deftask test #{compile data-load}
"This task runs the tests. It depends on compile and data-load."
(println "running tests...")
...)
Чтобы сделать то же самое в Leinhen, сначала придется создать каталог Leinhen в вашем проекте с 4 файлами: code_gen.clj, compile.clj, data_load.clj и my_test.clj.
SRC / Leinhen / Code_gen.clj
(ns leiningen.code-gen
"This task generates code. It has no dependencies.")
(defn code-gen []
(println "generating code..."))
SRC / Leinhen / my_compile.clj
(ns leiningen.my-compile
"This task does the compilation. It depends on code-gen."
(:use [leiningen.code-gen]))
(defn my-compile []
(code-gen)
(println "compiling..."))
SRC / Leinhen / data_load.clj
(ns leiningen.data-load
"This task loads the test data. It depends on code-gen."
(:use [leiningen.code-gen]))
(defn data-load []
(code-gen)
(println "loading test data..."))
SRC / Leinhen / my_test.clj
(ns leiningen.my-test
"This task runs the tests. It depends on compile and data-load."
(:use [leiningen.my-compile]
[leiningen.data-load]))
(defn my-test []
(my-compile)
(data-load)
(println "running tests..."))
Осталось ожидать ...
generating code...
compiling...
loading test data...
running tests...
Но как нагрузка на данные, так и моим компиляцией зависят от кода-GEN, поэтому ваша фактическая выпутана ...
generating code...
compiling...
generating code...
loading test data...
running tests...
Вы должны были бы использовать код Moveize-Gen для предотвращения его работы несколько раз:
(ns leiningen.code-gen
"This task generates code. It has no dependencies.")
(def code-gen (memoize (fn []
(println "generating code..."))))
выход:
generating code...
compiling...
loading test data...
running tests...
Который мы хотим.
Сборки проще и эффективны, если задача работает только один раз за сборку, поэтому мы сделали его поведением по умолчанию в корпусных сборках. Философия - это десятилетия старые и поделились излучениями инструментов сборки. Вы все еще можете использовать функции, вы все еще можете позвонить им неоднократно, и у вас всегда есть полная мощность Clojure в вашем распоряжении.
Лейн просто дает вам простоту как задачу, но с дополнительным ограничением, что он должен иметь свое собственное пространство имен в SRC. Если задача зависит от этого, она будет в отдельном пространстве имен и должна использовать / требовать другого в нем ns
макрос Тортские сборки выглядят много моряки и краткости по сравнению.
Еще одно ключевое отличие заключается в том, как задачи добавлены. Допустим, мы хотели добавить my-test
как предпосылки для торта / лейна встроены jar
задача. В торт, вы можете использовать deftask
Макрос для добавления к форм и зависимостям задачи.
(deftask jar #{my-test})
Лейн использует Роберт Гуке, чтобы добавить к задачам. Это действительно классная библиотека, названная в честь любимой любимой философии каждого, но это потребует макроса для краткости deftask
.
(add-hook #'leiningen.jar/jar (fn [f & args]
(my-test)
(apply f args)))
Торт также имеет представление о глобальном проекте. Вы можете добавить пользовательские конкретные Dev-зависимости, как Swank, чтобы ~/.cake/project.clj
И у него все ваши проекты. Глобальный проект также используется для начала замедления за пределами проекта для экспериментов. Лейн реализует аналогичные функции, поддерживая конфигурацию для каждого пользователя в ~/.lein/init.clj
, и глобальные плагины в ~/.lein/plugins
. Отказ В целом, Лейн в настоящее время имеет гораздо более богатый плагин экосистемы, чем торт, но торт включает в себя больше задач из коробки (война, развертывание, компиляция Java, собственные зависимости, Clojars и Swank). CLJR также стоит того, чтобы выяснить, что это, по сути, это просто глобальный проект с менеджером пакета, но без возможностей сборки (у меня нет опыта с этим, однако).
Настоящая неприкосновенная разница - это определение задач, как указала Техномия. В моем (смещенном) мнении торт обрабатывает задачи намного лучше. Необходимость модели зависимости задач стала очевидной, когда мы начали использовать буферы протокола в нашем проекте с Лейным. Протобуфы были предрешены для всех наших задач, но компиляцию их действительно медленные. У нас также есть много взаимозависимых задач, поэтому любая сборка была болезненной. Я также не люблю требование отдельной пространства имен и, следовательно, дополнительный файл SRC, для каждой задачи, которую я создаю. Разработчики должен Создайте много задач, подход Лейна отговаривает это, создавая слишком много трения. С торт, вы можете просто использовать макрос Deftask в Project.clj.
Торт по-прежнему молодой, а работа в процессе, но это очень активный проект.
Как 2011-11-15, объявление оТорт и Лейна сливаются