2010-03-06 2 views
46

Я новичок в Clojure, и я начинаю экспериментировать со строительством приложения.Рекомендации по созданию и развертыванию приложений Clojure: хорошие учебные пособия?

До сих пор все, что я видел о учебниках по компиляции программ Clojure, подразумевает интерактивность. Например, «загрузите REPL и введите (load-file« this-or ») для запуска. Это нормально, но этого недостаточно.

Я так привык к идиомам редактирования компиляции таких как C или Delphi, что я инстинктивно движется, чтобы делать изменения, а затем нажимать «Mx compile».

Проблема в том, что «lein uberjar», который, как я понимаю, эквивалентен «make», для выполнения даже для приветственного мира. Поэтому мне нужно выяснить, как работает этот «интерактивный проект», прекратить использование uberjar, как будто это быстро сделать, и сохранить его только в конце дня.

Еще одна вещь, которую я заметил при построении (используя lein uberjar), состоит в том, что s mall GUI app Я работаю над всплывающими кадрами в процессе компиляции, как если бы они составляли , выполняя во время компиляции. Мне кажется, это немного противоречит мне; это не совсем так же похоже на «сделать», как я думал.

Я знаю, что способ разработки Lisp в интерактивном режиме работает в REPL, и я не пытаюсь изменить это: я хотел бы адаптироваться к этому образу жизни. К сожалению, я мало видел в форме документации о том, как это сделать. Например, как сбросить текущее состояние машины. Просто кажется бесполезным просто компилировать отдельные фрагменты на лету, не имея возможности сделать какой-то сброс.

Большинство учебных пособий, которые я видел на Clojure (и Lisp), похоже, сосредоточены на взломе в REPL. Рекомендации по развертыванию приложений остаются для меня загадкой. Мои пользователи просто будут пользователями; они не собираются быть разработчиками, которые собираются загружать файлы в REPL.

Итак, вот мой вопрос: любые ресурсы для хорошей информации или учебники по всему процессу создания приложения Clojure, включая развертывание?

(Примечание: У меня есть все необходимые условия и рабочие условия (например, Emacs, Slime, Leiningen и т. Д.), Так что это не вопрос об этом).

ответ

25

Несколько быстрых подсказок, то некоторые ссылки:

Не используйте lein uberjar в процессе развития; предпочитают lein jar. Разница в том, что lein uberjar ставит все ваши зависимости в сгенерированном jar (включая самого Clojure), так что ваша единственная банка - это полностью автономный пакет с вашим приложением внутри; lein jar только барабаны свой собственный код. Подход uberjar имеет очевидные преимущества для развертывания, но для разработки вы должны просто использовать соответствующий путь к классам при запуске приложения, экономя время, необходимое для подготовки uberjar. Если вы не хотите управлять маршрутом classpath для тестовых прогонов, проверьте lein run plugin.

Кроме того, скорее всего, большая часть вашего кода не должна быть фактически скомпилирована. AOT необходим в некоторых сценариях взаимодействия Java, но большую часть времени он привносит небольшой импульс в скорость запуска и раздражает проблемы с бинарной совместимостью с различными версиями Clojure. Я полагаю, что последняя проблема не относится к проекту автономного приложения uberjar, но, по крайней мере, любой библиотечный код должен быть оставлен JIT-ed, если это вообще возможно.С Leiningen вы можете поместить предложение :namespaces в форму defproject в project.clj, чтобы определить, какие пространства имен должны быть скомпилированы; независимо от того, что вы оставите, по умолчанию будет JIT-ed. Старые версии Leiningen использовались для компиляции всего по умолчанию, что на самом деле является хорошей причиной для обновления!

Что касается окон, всплывающих во время компиляции, я бы предположил, что вы либо запускаете код выхода из окна во время расширения макроса, либо вне какого-либо определения функции или аналогичной конструкции. (Что-то вроде (println "Foo!") на верхнем уровне.) Это то, что вы не должны делать, я полагаю, если вы не планируете запускать свой код как скрипт. Чтобы избежать проблемы, оберните побочный код в определениях функций и укажите точку входа в приложение с помощью предложения :main в project.clj. (Если вы скажете :main foo, то функция -main из пространства имен foo будет использоваться в качестве точки входа в ваше приложение. Это по умолчанию, во всяком случае, и, по крайней мере, вышеупомянутое lein run, похоже, имеет имя hardcoded - не уверен в lein сам).

Что касается сброса состояния REPL - вы можете просто перезапустить его. С помощью SLIME M-x slime-restart-inferior-lisp будет делать это, сохраняя при этом все остальные состояния вашего сеанса Emacs.

Смотрите также эти обсуждения группы Clojure Google:

  1. Clojure for system administration
  2. Prepping clojure for packaging (was: Re: Clojure for system administration)
  3. Leiningen, Clojure and libraries: what am I missing?
+0

Спасибо за информацию и ссылки! Плагин lein run выглядит так, как будто это поможет мне. Конечно, это приводит к другому вопросу: http://stackoverflow.com/questions/2393705/how-to-install-a-leiningen-plugin – kes

+0

Добро пожаловать! Просто ответил на новый вопрос. :-) –

13

Нет, не входят функции на РЕПЛ.

Вы редактируете исходные файлы, как обычно. Преимущество Lisp заключается в том, что у вас одновременно работает система в фоновом режиме, поэтому вы можете скомпилировать отдельные функции из исходного файла и поместить их в запущенную систему или даже заменить их там.

Если вы используете Slime, вы нажимаете C-c C-c в исходном файле для компиляции и загрузки функции в точке. Затем вы можете переключиться на REPL для тестирования и изучения, но все, что вы хотите сохранить в качестве источника, вы помещаете в свои исходные файлы.

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


Просто, чтобы проиллюстрировать, мой обычный рабочий процесс (я использую Common Lisp, но Clojure аналогично), как это:

  • Начало Emacs
  • M-x slime начать Слизь, лисповскую систему, и соединить два через Суонк
  • , (команда) load-systemfoo загрузить текущий проект (компиляцию только в случае необходимости) в изображение
  • C-x b переход на исходный буфер
  • C-c ~ сделать исходный каталог текущего каталога и исходный пакет текущий пакет из REPL

Сейчас я настроен с моей системой, работающей в фоновом режиме. Рабочая тогда:

  • изменить или добавить функцию или класс определение
  • C-c C-c скомпилировать и загрузить его в образ
  • переключатель в РЕПЛ, тест
  • отладки

Есть никакая значительная компиляция не приостанавливается, потому что я никогда не собираю все это сразу, а только отдельные определения.

+2

Существует также 'C-c C-z' для переключения в буфер REPL из любого исходного буфера Lisp. В общем, первоочередной задачей является научиться правильно использовать SLIME и Paredit, а затем есть несколько менее важных, но все же чрезвычайно полезных вещей, например. ido-mode (или что-то для достижения аналогичной цели - возможно, сосульки или что-нибудь). (Спасибо за редактирование, BTW!) –

+0

Я установил селектор слизи на 'C-c s', что дает еще несколько вариантов переключения буфера. – Svante