Как я могу минимизировать компиляцию AOT в leiningen (Clojure) - PullRequest
2 голосов
/ 31 октября 2010

При создании проекта Clojure с помощью leiningen все * .clj-файлы компилируются AOT. Обычно компиляция AOT не нужна, и я хотел бы свести ее к минимуму.

Это необходимо для того, чтобы повысить признание Clojure в качестве дополнения в среде, где доминирует Java. Проще «продать» один файл класса в качестве клея вместе с парой clj-файлов по килобайту, вместо альтернативы иметь 250+ килобайтные файлы классов со странными именами и спрятать среди них маленький clj-файл (который не даже больше не читал во время исполнения).

В идеале результатом "компиляции lein" должен быть только один маленький файл класса, который (вместе с clj-файлами и библиотекой clojure) реализует необходимый экземпляр класса.

Какой самый простой способ добиться этого? Я бы предпочел не писать ни одной строки Java (конечно).

Обновление после обратной связи от Technomancy

Я не подозреваю, что это проблема leiningen. Позвольте мне объяснить, что я после с примером. Пожалуйста, прости длину примера. Я использую leiningen 1.3.1, но я думаю, что 1.4.0-SNAPSHOOT ведет себя так же.

$ lein new dummy
Created new project in: dummy
$ cd dummy

Теперь измените project.clj на (добавлено ": main dummy.core"):

(defproject dummy "1.0.0-SNAPSHOT"
  :description "FIXME: write"
  :dependencies [[org.clojure/clojure "1.2.0"]
                 [org.clojure/clojure-contrib "1.2.0"]]
  :main dummy.core)

и src / dummy / core.clj для:

(ns dummy.core
  (:gen-class))
(defn -main [& args]
  (println "This is Clojure code, args=" args))

Теперь скомпилируйте его:

$ lein compile
Compiling dummy.core

Создает следующие файлы в classes / dummy :

core.class
core__init.class
core$loading__4410__auto__.class
core$_main.class

Это все правильно, я могу выполнить результат:

$ java -cp lib/*:classes dummy.core Hello
This is Clojure code, args= (Hello)

Теперь приходит то, что я хочу иметь вместо этого, но я делаю это вручную: Я могу удалить все файлы классов, кроме core.class и , скопировать core.clj в classes / dummy , который теперь выглядит очень пустым :

$ ls classes/dummy/
core.class
core.clj

core.class содержит код для загрузки core.clj во время выполнения, и результат все тот же, я все еще могу сделать:

$ java -cp lib/*:classes dummy.core Hello
This is Clojure code, args= (Hello)

Я также могу изменить core.clj (примечание: в classes / dummy !) И, конечно, изменения не нужно перекомпилировать.

Теперь мой вопрос сводится к следующему: Есть ли более простой способ получить только этот core.class?

1 Ответ

4 голосов
/ 31 октября 2010

Лейнинген уже давно не выполняет AOT по умолчанию; возможно у вас есть более старая версия? Но есть новая функция (в 1.4.0-SNAPSHOT), которая гарантирует, что файлы .class, созданные в результате транзитивного AOT, будут удалены перед созданием jar (см. Clojure assembly # 322), что также может вас заинтересовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...