2012-03-23 38 views
5

Tôi muốn sử dụng tuyệt vời Sass như một phần của quá trình xây dựng của mình. Quá trình xây dựng của tôi được quản lý bởi Gradle. Điều đó có nghĩa là viết một plugin để chạy Sass. Sass là Ruby, và Gradle là trong Groovy, nhưng kể từ khi Groovy chạy trên JVM, tôi có thể sử dụng JRuby để chạy nó, bằng cách sử dụng Java scripting API. Các kịch bản lệnh Gradle nhận được các phụ thuộc dưới dạng tệp jar; tôi có thể lấy JRuby từ Maven Central, nhưng tôi sẽ cần phải gói Sass như một cái bình của tôi.Làm thế nào tôi có thể sử dụng gem-in-a-jar với JRuby nhúng?

Tôi đã cố gắng theo dõi Nick Sieger's gems-in-a-jar procedure để thực hiện việc này nhưng không thành công. Không có vấn đề gì tôi làm, tôi chỉ có thể không nhận được JRuby để chọn đá quý Sass.

Để cô lập các vấn đề, tôi đã viết một chương trình Java tối thiểu (không Gradle) mà cố gắng sử dụng Sass qua JRuby - i inventively gọi nó JSass:

Có hai hoặc ba bit thú vị. Đầu tiên là kịch bản generate-gem-jar.sh, trong đó xây dựng các jar đá quý:

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

Thứ hai là lớp so.demo.JSass, chạy JRuby:

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); 

Thứ ba là kịch bản Ruby mà những lớp học chính cố gắng sử dụng để vận hành Sass:

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

Chương trình có thể tải động cơ JRuby và thực thi tập lệnh nhưng không thành công tại require 'sass', nói rằng:

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 

Tôi đang làm gì sai?

+0

Bạn có bao giờ làm việc này với câu trả lời từ Kares hoặc giải pháp thay thế không? – nopuck4you

+0

@ nopuck4you: Không. Cách tiếp cận của Kares yêu cầu (a) tôi khởi động chương trình bằng thông qua rgems runnable jar, mà tôi không thể, và (b) rằng gem là một thư mục chưa được giải nén, mà tôi thực sự không muốn. Tôi đã không có thời gian để thực sự tấn công vấn đề bản thân mình kể từ khi đăng câu hỏi này, thật đáng buồn. –

+3

Tôi nhận được sass làm việc trong mã của tôi bằng cách sử dụng một cách tiếp cận tương tự. Tôi chạy vào cùng một lỗi chính xác mà stumped tôi trong 3 ngày. Hóa ra là cách tôi đóng gói lại sass-lang.đá quý vào một JAR đã được thả các tập tin đá quý để JAR là không hợp lệ. Tôi đã có một dự án làm việc để đóng gói lại đá quý cho một JAR ở đây: https://github.com/dmitrye/sass-gems. và đây là một ví dụ về cách tôi tiêu thụ nó: https://github.com/dmitrye/wro4j/blob/1.4.x/wro4j-extensions/src/main/java/ro/isdc/wro/extensions/processor /support/sass/RubySassEngine.java. Hãy cho tôi biết nếu điều này sẽ giúp. – nopuck4you

Trả lời

0

vẻ như với tôi rằng nó sẽ chỉ làm việc miễn là nó được thực hiện như một java -jar -rgems.jar bạn có thể làm công việc này, bạn không cần phải gói nó trong một .jar chỉ lấy sass-xxx thư mục (kết quả của gem install sass) và lưu nó trong một nơi được biết đến và thêm đó là thư mục lib đến $LOAD_PATH ... kể từ khi bạn đã xây dựng jar đã tôi sẽ giả định nó là trong một thư mục làm việc hiện tại:

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

nhu cầu này xảy ra trước dòng cuối cùng của bạn rubyEngine.eval(script, context);

nếu không có trong bình thì phải giống như chỉ định đường dẫn, ví dụ:

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

hãy lưu ý rằng điều này sẽ chỉ hoạt động nếu đá quý sass không phụ thuộc vào đá quý khác!

Các vấn đề liên quan