Вопрос

В чем разница между том и Лейнингеном?

Это было полезно?

Решение

Этот ответ продолжает получать интерес, предполагаемо, по-видимому, в качестве ссылки на 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, объявление оТорт и Лейна сливаются

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top