سؤال

عندما تقوم بإنشاء مشروع clojure مع Lininingen يتم تجميع جميع ملفات *.clj AOT. عادةً ما يكون تجميع AOT ضروريًا وأرغب في تقليله.

هذا ضروري بالنسبة لي لرفع قبول Clojure كمكمل في بيئة يسيطر عليها Java. من الأسهل "بيع" ملف فئة واحد مثل الغراء مع بضع كيلو بايت من ملفات CLJ مقابل البديل المتمثل في وجود أكثر من 250 كيلو بايت من ملفات الفصل بأسماء غريبة ومخفية بينها قليلاً من ملف CLJ حتى قراءة أي مرة أثناء التنفيذ).

من الناحية المثالية ، لن تكون نتيجة "مجموعة Lein" سوى ملف فئة صغير واحد (جنبًا إلى جنب مع ملفات CLJ و Clojure-Library) ينفذ الثابت المطلوب.

ما هي أسهل طريقة لتحقيق ذلك؟ أفضل عدم كتابة سطر واحد من جافا (بالطبع).

تحديث بعد التعليقات من التقنية

لا أشك في أن هذه مشكلة في لينينين. اسمحوا لي أن أشرح ما أنا عليه بعد مثال. أرجوك سامح طول المثال. أنا أستخدم Lininingen 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

هذا يولد الملفات التالية في فصول/دمية:

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 في فصول/دمية الذي يبدو الآن فارغًا جدًا:

$ 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 (ملاحظة: في فصول/دمية!) وبالطبع لا تحتاج التغييرات إلى إعادة ترجمة.

الآن سؤالي يتلخص في هذا: هل هناك وسيلة أسهل للحصول على هذا النواة فقط؟

هل كانت مفيدة؟

المحلول

لم يقم لينينينجن بمناسبة الافتراضي لبعض الوقت الآن ؛ ربما لديك نسخة أقدم؟ ولكن هناك ميزة جديدة (في 1.4.0-snapshot) تضمن ملفات .class التي تم إنشاؤها بسبب حذف AOT متعدية قبل إنشاء جرة ، (انظر Clojure Assembla #322) والتي قد تهمك أيضًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top