Статьи

Clojure библиотеки и сборки с Leiningen

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: обязательно сделайте небольшие шаги, чтобы легко найти любую ошибку в последних написанных вами строках.