Leiningen — это инструмент автоматизации для проектов Clojure: хотя теоретически вы могли бы продолжать использовать Ant и Maven напрямую для загрузки зависимостей JAR и для выполнения задач, таких как набор тестов проекта, Leiningen позволяет вам писать только код Clojure и генерировать на лету все остальное.
Короче говоря, Leiningen будет использовать Ant и Maven под прикрытием и следовать модели загрузки и кэширования зависимостей по всему миру, а не хранить их вместе с исходным кодом. Но вы не увидите под капотом.
Установка
Предполагая, что вы используете систему Linux, такую как Ubuntu и поставляемую копию Clojure, установка пакета leiningen предоставит вам команду lein .
Кроме того, вы можете скачать один скрипт из папки / каталога, поместить его по своему пути и сделать его исполняемым. При первом выполнении он самозагрузится, загрузив недостающие зависимости.
Есть также инструкция по установке для Windows-боксов, как для самостоятельной установки, так и для автономной версии.
Прохождение: создание нового проекта
Leiningen может создать простой каркас для нашего проекта:
[08:37:53][giorgio@Desmond:~/code]$ lein new clojure-midje-example Created new project in: /home/giorgio/code/clojure-midje-example [08:38:01][giorgio@Desmond:~]$ cd code/clojure-midje-example [08:38:29][giorgio@Desmond:~/code/clojure-midje-example]$ tree . ├── project.clj ├── README ├── src │ └── clojure_midje_example │ └── core.clj └── test └── clojure_midje_example └── test └── core.clj 5 directories, 4 files
Мы видим папку test и src в лучших традициях Java / JVM. Исходный файл, созданный в качестве примеров, следует структуре папок как пространства имен:
[09:00:17][giorgio@Desmond:~/code/clojure-midje-example]$ cat test/clojure_midje_example/test/core.clj (ns clojure-midje-example.test.core (:use [clojure-midje-example.core]) (:use [clojure.test])) (deftest replace-me ;; FIXME: write (is false "No tests have been written."))
Вы уже можете попробовать выполнить неудачный тест:
[09:02:52][giorgio@Desmond:~/code/clojure-midje-example]$ lein test Copying 1 file to /home/giorgio/code/clojure-midje-example/lib Testing clojure-midje-example.test.core FAIL in (replace-me) (core.clj:6) No tests have been written. expected: false actual: false Ran 1 tests containing 1 assertions. 1 failures, 0 errors.
И, конечно же, напишите реальный тест:
[09:05:05][giorgio@Desmond:~/code/clojure-midje-example]$ cat test/clojure_midje_example/test/core.clj (ns clojure-midje-example.test.core (:use [clojure-midje-example.core]) (:use [clojure.test])) (deftest the-simplest-test-you-can-write (is 3 (+ 1 2))) [09:05:08][giorgio@Desmond:~/code/clojure-midje-example]$ lein testTesting clojure-midje-example.test.core Ran 1 tests containing 1 assertions. 0 failures, 0 errors.
Leiningen также создает файл .gitignore, который позволяет игнорировать скомпилированные классы, любые JAR-файлы, сгенерированный XML и собственные метаданные Leiningen.
Установка библиотеки: Midje
Midje — это тестовая среда для Clojure, которую я хочу установить как для возможности опробовать ее позже, так и для демонстрации того, как Leiningen может использовать библиотеку.
Файл project.clj содержит все определения зависимостей, которые Leiningen будет использовать для получения JAR-файлов. Формат: dependencies представляет собой список из 2 элементов, где каждый 2-элементный список содержит имя библиотеки и требуемую версию в виде строки.
[09:06:11][giorgio@Desmond:~/code/clojure-midje-example]$ cat project.clj (defproject clojure-midje-example "1.0.0-SNAPSHOT" :description "FIXME: write description" :dependencies [[org.clojure/clojure "1.2.1"]])
По умолчанию Leiningen будет получать пакеты из Clojars, основного репозитория сообщества для библиотек Clojure, и из Maven Central.
Давайте исправим наш project.clj, включив в него midje и midje-lein, два JAR-файла, которые сделают Midje доступным для текущего проекта. Первая — это настоящая библиотека, а вторая — команда lein midje, более приятная версия теста lein.
[09:12:52][giorgio@Desmond:~/code/clojure-midje-example]$ cat project.clj (defproject clojure-midje-example "1.0.0-SNAPSHOT" :description "FIXME: write description" :dependencies [[org.clojure/clojure "1.2.1"] [midje "1.3.0"]] :dev-dependencies [[lein-midje "1.0.7"]])
Я добавил midje в: dependencies просто для того, чтобы показать другую опцию для библиотек, но на самом деле ее следует поместить в: dev-dependencies. Разница заключается в том, что в последнем случае он не будет поставляться в пакете JAR проекта и не включаться в проекты, которые зависят от текущего.
Чтобы проверить наличие midje, давайте напишем самый простой тест midje:
[09:17:04][giorgio@Desmond:~/code/clojure-midje-example]$ cat test/clojure_midje_example/test/core.clj (ns clojure-midje-example.test.core (:use [clojure-midje-example.core]) (:use [clojure.test]) (:use [midje.sweet])) (deftest the-simplest-test-you-can-write (is 3 (+ 1 2))) (fact (+ 1 2) => 3) [09:16:55][giorgio@Desmond:~/code/clojure-midje-example]$ lein midje>>> clojure.test summary: Ran 1 tests containing 1 assertions. 0 failures, 0 errors. >>> Midje summary: All claimed facts (1) have been confirmed.
Больше команд lein
Я разместил этот пример на Github , как для вашей, так и для моей будущей ссылки.
Для тех из вас, кто не имеет опыта работы с JVM, не пытайтесь запускать файлы .clj изолированно: lein всегда следует использовать в качестве оболочки, чтобы он мог размещать зависимости в пути к классам.
Лейн предоставляет много других команд для этой цели; например:
- Lein перспектива будет вызывать -main функции в пространстве имен , определенных с: основным в project.clj (это легко показать , чем объяснить: см . исходный код)
- lein help run отобразит информацию о команде run; замените свою любимую команду, чтобы узнать все ее параметры и как она взаимодействует с project.clj.
- lein jar и lein uberjar создадут JAR и автономный JAR соответственно для распространения вашего кода.
Выводы
Вы не видите его в этом примере вывода, но lein midje также предоставляет цвета (зеленая полоса), поскольку это пользовательская задача Leiningen. Фактическое использование Midje выходит за рамки этой статьи, но я надеюсь, что предоставил простой способ получить зависимости внутри вашего проекта.
Lein прост в использовании и предоставляет достаточно документации для основных случаев использования; в интегрирует тестирование как первоклассную задачу. Однако сообщения об ошибках несколько загадочны, и это типично для Clojure: обязательно сделайте небольшие шаги, чтобы легко найти любую ошибку в последних написанных вами строках.