Как я могу минимизировать сборку AOT в Лейнингене (Clojure)

StackOverflow https://stackoverflow.com/questions/4062643

  •  27-09-2019
  •  | 
  •  

Вопрос

Когда вы создаете проект Clojure с Leiningen, все файлы * .Clj скомпилированы AOT. Обычно компиляция AOT не нужна, и я хотел бы минимизировать его.

Мне необходимо повысить принятие Clojure в качестве дополнения в среде, доминирующую в Java. Легче «продавать» один класс-файл в виде клея вместе с парой KB CLJ-файлами против альтернативы наличия 250+ класс классов Kb со странными именами и скрытым среди них немного CLJ-файл (который ISN Даже даже читайте больше во время выполнения).

В идеале результат «компиляции Лейна» будет только один маленький файл классов, который (вместе с CLJ-файлами и библиотекой Clojure) реализуют необходимый класс-экземпляр.

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

Обновление после отзывы от Technamancy

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

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

Теперь измените Project.clj до (добавлено ": главный 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

Это генерирует следующие файлы в Классы / манекен:

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.Cass. а также скопировать Core.clj в Классы / манекен Что сейчас выглядит очень пусто:

$ 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 (Примечание: в Классы / манекен!) И конечно изменения не нужно перекомпилировать.

Теперь мой вопрос сводится к этому: Есть ли более простым способом получить только это CORE.Class?

Это было полезно?

Решение

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top