2012-03-23 16 views
5

मैं अपनी निर्माण प्रक्रिया के हिस्से के रूप में उत्कृष्ट Sass का उपयोग करना चाहता हूं। मेरी निर्माण प्रक्रिया Gradle द्वारा प्रबंधित की जाती है। इसका मतलब है सैस चलाने के लिए एक प्लगइन लिखना। सास रूबी है, और ग्रैडल ग्रोवी में है, लेकिन चूंकि ग्रोवी जेवीएम पर चलता है, इसलिए मैं जावा scripting API का उपयोग करके इसे चलाने के लिए JRuby का उपयोग कर सकता हूं। ग्रैड स्क्रिप्ट को जार फ़ाइलों के रूप में निर्भरता मिलती है; मैं Maven Central से जेआरबीई प्राप्त कर सकता हूं, लेकिन मुझे सास को एक जार के रूप में पैकेज करने की आवश्यकता होगी।मैं एम्बेडेड जेआरबी के साथ रत्न-इन-ए-जार का उपयोग कैसे कर सकता हूं?

मैंने ऐसा करने के लिए Nick Sieger's gems-in-a-jar procedure का पालन करने का प्रयास किया है, लेकिन इसमें कोई सफलता नहीं मिली है। कोई फर्क नहीं पड़ता कि मैं क्या करता हूं, मैं बस जेसबी को सास मणि लेने के लिए नहीं मिल सकता।

समस्या को अलग करने के लिए, मैं एक न्यूनतम जावा (नहीं Gradle) प्रोग्राम है जो JRuby के माध्यम से सास का उपयोग करने की कोशिश करता है लिखा है - मैं inventively यह JSass फोन:

वहाँ दो हैं या तीन दिलचस्प बिट्स।

ScriptEngine rubyEngine = new ScriptEngineManager().getEngineByName("jruby"); 
ScriptContext context = rubyEngine.getContext(); 
context.setAttribute("inputFile", inputFile, ScriptContext.ENGINE_SCOPE); 
String script = IOUtils.toString(JSass.class.getResourceAsStream("sassdriver.rb")); 
rubyEngine.eval(script, context); 

तीसरे रूबी स्क्रिप्ट जो मुख्य वर्ग की कोशिश करता है:

gem install -i build/gems sass --no-rdoc --no-ri 
jar cf lib/gemsass.jar -C build/gems . 

दूसरा so.demo.JSass वर्ग है, जो JRuby चलाता है: पहली स्क्रिप्ट generate-gem-jar.sh, जो मणि जार बनाता है कह

require 'sass' 
template = File.load(inputFile) 
sass_engine = Sass::Engine.new(template) 
output = sass_engine.render 
puts output 

कार्यक्रम JRuby इंजन लोड और स्क्रिप्ट को निष्पादित करने में सक्षम है, लेकिन यह require 'sass' में विफल रहता है,: सास संचालित करने के लिए उपयोग करें:

LoadError: no such file to load -- sass 
    require at org/jruby/RubyKernel.java:1033 
    (root) at <script>:1 
org.jruby.embed.EvalFailedException: (LoadError) no such file to load -- sass 
    at org.jruby.embed.internal.EmbedEvalUnitImpl.run(EmbedEvalUnitImpl.java:132) 
    at org.jruby.embed.jsr223.JRubyEngine.eval(JRubyEngine.java:90) 
    at so.demo.JSass.main(JSass.java:24) 
Caused by: org.jruby.exceptions.RaiseException: (LoadError) no such file to load -- sass 
Exception in thread "main" javax.script.ScriptException: org.jruby.exceptions.RaiseException: (LoadError) no such file to load -- sass 
    at org.jruby.embed.jsr223.JRubyEngine.wrapException(JRubyEngine.java:115) 
    at org.jruby.embed.jsr223.JRubyEngine.eval(JRubyEngine.java:93) 
    at so.demo.JSass.main(JSass.java:24) 
Caused by: org.jruby.exceptions.RaiseException: (LoadError) no such file to load -- sass 

क्या मैं गलत कर रहा हूँ?

+0

क्या आपने कभी इसे करेस या वैकल्पिक समाधान से उत्तर के साथ काम किया है? – nopuck4you

+0

@ nopuck4you: नहीं। केर्स के दृष्टिकोण की आवश्यकता है कि (ए) मैं rgems रननेबल जार के माध्यम से प्रोग्राम लॉन्च करता हूं, जिसे मैं नहीं कर सकता, और (बी) कि मणि एक अनपॅक निर्देशिका है, जिसे मैं वास्तव में नहीं चाहता हूं। दुख की बात है कि इस प्रश्न को पोस्ट करने के बाद मेरे पास वास्तव में समस्या पर हमला करने का समय नहीं है। –

+3

मुझे एक समान दृष्टिकोण का उपयोग करके मेरे कोड में काम कर रहा है। मैं उसी त्रुटि में भाग गया जो मुझे 3 दिनों तक फेंक दिया। यह पता चला कि जिस तरह से मैं सैस-लैंग repackaging था।एक जार में मणि मणि फाइलों को छोड़ रहा था ताकि जार अवैध था। मुझे यहां एक जार को मणि को दोबारा लगाने के लिए एक कामकाजी परियोजना है: https://github.com/dmitrye/sass-gems। और यहां एक उदाहरण है कि मैं इसे कैसे खा रहा हूं: https://github.com/dmitrye/wro4j/blob/1.4.x/wro4j-extensions/src/main/java/ro/isdc/wro/extensions/processor /support/sass/RubySassEngine.java। मुझे बताएं क्या इससे मदद मिलती है। – nopuck4you

उत्तर

0

मुझे लगता है कि यह केवल जब तक यह क्रियान्वित किया जाता है काम के रूप में एक java -jar -rgems.jar आप इस कार्य करवा सकते हैं, तो आप सिर्फ सास-xxx निर्देशिका ले एक .jar में यह पैकेज की जरूरत नहीं है जाएगा (gem install sass का परिणाम है) और एक ज्ञात स्थान में संग्रहीत और जोड़ने $LOAD_PATH करने के लिए इसे lib निर्देशिका है ... जब से तुम जार पहले से ही निर्माण किया है मैं इसे एक वर्तमान कार्यशील निर्देशिका में किया जा रहा ग्रहण करेंगे:

rubyEngine.eval("$LOAD_PATH << 'file://gemsass.jar!/gems/sass-3.1.15/lib'", context); 

इस जरूरतों आपकी अंतिम पंक्ति rubyEngine.eval(script, context);

से पहले होने के लिए

यदि यह जार में नहीं है तो यह वही होना चाहिए जो पथ को निर्दिष्ट करें उदा।

rubyEngine.eval("$LOAD_PATH << 'file:/home/42/gems/sass-3.1.15/lib'", context); 

कृपया ध्यान दें कि यह केवल तभी काम करेगा जब सास रत्न अन्य रत्नों पर निर्भर न हों!

संबंधित मुद्दे

 संबंधित मुद्दे