2017-01-23 8 views
2

Как настроить загрузку так, чтобы: (a) все исходные файлы находились в текущем каталоге, (b) модульные тесты запускаются каждый раз при изменении исходного файла, (c) REPL обновляет определения, когда исходные файлы, содержащие их, изменяются?Поиск простой настройки рабочего процесса для Clojure/boot

В частности:

  • Что идет в build.boot?

  • Какая команда оболочки запускает REPL? И/или какая команда в REPL запускает просмотр модульных тестов?

  • Какую еще обычную настройку мне нужно сделать?

Я прочитал много документации по boot, boot-test, boot-quick-test, REPL reloading in boot и boot-refresh, но я не смог получить много работать. Документация, которую я нашел до сих пор, кажется, дает лакомые кусочки и намеки, но не то, что необходимо для объединения этих вещей.

Простой пример подходящего build.boot (и любого другого) был бы особенно полезен.


До сих пор это то, что у меня есть (вроде).

(set-env! 
    :dependencies '[ 
    [adzerk/boot-test "1.1.2" :scope "test"] 
    [org.clojure/tools.namespace "0.2.11"]] 
    :source-paths #{"."}) 

(require '[clojure.tools.namespace.repl :as repl :refer [refresh]]) 
(apply repl/set-refresh-dirs (get-env :directories)) 

Плюс один файл в текущем каталоге, sample.clj:

(ns sample 
    (:require [clojure.test :refer :all])) 

(defn myfunc [] "this string") 

(deftest test-myfunc 
    (is (= "this string" (myfunc)))) 

Это получает загрузки найти исходные файлы в текущем каталоге, и это позволяет мне вручную перезагрузить изменения в sample.clj, набрав (refresh) в REPL. (boot (test)) используется для ручного запуска модульных тестов в файле .clj, но он провалился, когда я попробовал его только сейчас, с ошибкой «Неверное количество аргументов (0), переданных в: core/test».

Каков правильный способ сделать это?

ответ

1

Due to how Boot handles watching and notifying about file changes you cannot use clojure.tools.namespace.repl/refresh directly.

Вы можете использовать обертку для него - samestep/загрузочное обновления:

(set-env! 
:dependencies '[[adzerk/boot-test "1.1.2" :scope "test"] 
       [samestep/boot-refresh "0.1.0" :scope "test"]] 
:source-paths #{"."}) 

(require '[samestep.boot-refresh :refer [refresh]] 
     '[adzerk.boot-test :refer :all]) 

Теперь вы можете запустить сервер REPL, который будет перезагружать на изменения файлов:

boot repl -s watch refresh

И подключитесь к нему либо из вашей IDE (например, CIDER или Cursive), либо через:

boot repl -c

и всякий раз, когда происходят изменения в исходные файлы, обнаруженные соответствующие пространства имен будет перезагружен и доступны в вашем клиент REPL сессии.

Вы также можете запустить boot watch test в другом терминале, чтобы получить автоматическое тестирование.

И, наконец, ваш вопрос с (boot (test)) давая неверное число аргументов (0) передается: ядро ​​/ тест было вызвано тем, что вы не требуется adzerk.boot-test, который содержит test задачу, которую вы хотели позвонить. Похоже, что может быть clojure.test/test, который был вызван вместо этого.

+0

Спасибо! Я снова начинаю работать. Я не знал о том, как запустить два процесса REPL. Еще одна ошибка: когда я добавляю новый 'defn' в исходный файл, процесс' repl -s' перезагружает его, но процесс 'repl -c' не видит его. То есть, если я попытаюсь вызвать новую функцию в командной строке клиента REPL, она даст мне «Невозможно разрешить символ». Однако изменения в определении уже существующей функции отображаются в процессе 'repl -c'. Какие-либо предложения? –

+0

Я думаю, что это может быть проблема с тем, как 'require' с': refer' и/или ': as' работают внутри. Я получаю те же проблемы, но при вызове новых символов с полным ns работает для меня. –

+0

Какая команда вызывает новые символы с полным ns? (Я не уверен, что означает «называть новые символы».) –