2015-09-13 12 views
9
class Test 

    def initialize 

    end 

    def crash 
    print x 
    end 

end 

Test.new.crash 

hata hattını, şunda derlenmiş kodu alırsınız aynı hatayı at.Eğer Opal ile bu ayrıştırma Eğer Açıkçası bu pasajı hattı 8. donabiliyor Ruby Opal kodu

Ancak, bu hatanın geldiği Ruby satırını belirlemenin bir yolu var mı?

Şu soruyu görebiliyorum: Is there a way to show the Ruby line numbers in javascript generated by Opal, ama cevabı anlamıyorum: Bu bana https://github.com/opal/opal/tree/0-6-stable/examples/rack yol açar ve ne baktığımı veya ne yaptığımı bilmiyorum.

benim javascript çalıştırmak

, o zaman son olarak bir <script> etiketinde benim derlenmiş Yakut-JavaScript kodu var, opal.min.js ve opal-parser.min.js yükleyen bir index.html dosyası var.

+0

Yanıtın yazarı @ [http://stackoverflow.com/questions/24218609/is-there-a-way-to-show-the-ruby-line-numbers-in-javascript-generated-by- opal] (http://stackoverflow.com/questions/24218609/is-there-a-way-to-show-the-ruby-line-numbers-in-javascript-generated-by-opal) bir güncelleme yayınladı. Muhtemelen bir göz atmalısınız ...;) – juliobetta

+0

@juliobetta evet, okuduğum şey bu. Sprockets veya Rack kullanmam ya da herhangi bir şeyi gerçekten kullanmıyorum. Bunun ne olduğunu bile bilmiyorum. – Voldemort

cevap

2

Opal, bu tür kaynak hata ayıklamasını kolaylaştırmak için source map support sahiptir. Sourcemaps hakkında ayrıntılara girmeyeceğim, ancak HTML5Rocks, konuyu derinlemesine ele alan bir great article'a sahip. Bize doğrudan kullanmasına izin

class Test 

    def initialize 

    end 

    def crash 
    print x 
    end 

end 

Test.new.crash 

Bunun yerine yabancı utilties bir çok kullanmak ister beri:

Let bizim kaynak dosyası index.rb: Burada

Opal o kurmak için asgari demirbaş olan Opal API'sı. Yukarıdaki dosyayı derlemek olacak bir dosya builder.rb oluşturun:
require 'opal' 
Opal::Processor.source_map_enabled = true 
Opal.append_path "." 

builder = Opal::Builder.new.build('index') 

# Write the output file containing a referece to sourcemap 
# which we generate below : this will help the browser locate the 
# sourcemap. Note that we are generating sourcemap for only code and not 
# the entire Opal corelib. 
# 
File.binwrite "build.js", "#{builder.to_s}\n//# sourceMappingURL=build.js.map" 
File.binwrite "build.js.map", builder.source_map.to_s 

File.binwrite "opal_lib.js", Opal::Builder.build('opal_lib') 

Ayrıca sadece içeren bir opal_lib.rb dosyası oluşturmak:
require 'opal' 

Nihayet bize tarayıcıda komut dosyasını çalıştırmak sağlayacak bir index.html oluşturun.

ruby builder.rb 

Bu derlenmiş üretecektir javascript dosyaları opal_lib.js ve bizim index.html dosyası tarafından başvurulan build.js:

<!DOCTYPE html> 
<html> 
    <head> 
    <script src="opal_lib.js"></script> 
    <script src="build.js"></script> 
    </head> 
    <body> 
    </body> 
</html> 

Şimdi aslında çalıştırın dosyanızı derlemek için. Şimdi tarayıcınızda sadece index.html'u açın. tarayıcıyı kullanmak üzere

Opal error stack trace


alternatif olarak:

Opal error stack screenshot

kaynak dosyasının satır numaraları mevcuttur: Tam bir çağrı yığını ve kaynak görünümünü alacak Aynı zamanda Node.js'yi de aynı amaçla kullanabilirsiniz. Bu, Node.js ve npm'un yüklü olmasını gerektirir.Ayrıca Şimdi düğüm Repl açın ve aşağıdaki girebilirsiniz npm modülünü source-map-support

npm install source-map-support 

yüklemeniz gerekir:

require('source-map-support').install(); 
require('./opal_lib'); 
require('./build'); 

Alacaksın doğru kaynak hattı numaraları ile bir yığın izleme almak:

/home/gaurav/Workspace/opal-playground/opal_lib.js:4436 
     Error.captureStackTrace(err); 
      ^
NoMethodError: undefined method `x' for #<Test:0x102> 
    at OpalClass.$new (/home/gaurav/Workspace/opal-playground/opal_lib.js:4436:15) 
    at OpalClass.$exception (/home/gaurav/Workspace/opal-playground/opal_lib.js:4454:31) 
    at $Test.$raise (/home/gaurav/Workspace/opal-playground/opal_lib.js:4204:31) 
    at $Test.Opal.defn.TMP_1 (/home/gaurav/Workspace/opal-playground/opal_lib.js:3032:19) 
    at $Test.method_missing_stub [as $x] (/home/gaurav/Workspace/opal-playground/opal_lib.js:886:35) 
    at $Test.$crash (/home/gaurav/Workspace/opal-playground/index.rb:8:11) 
    at /home/gaurav/Workspace/opal-playground/index.rb:13:10 
    at Object.<anonymous> (/home/gaurav/Workspace/opal-playground/index.rb:13:10) 
    at Module._compile (module.js:435:26) 
    at Object.Module._extensions..js (module.js:442:10) 

sana mücevher yönetimi için bundler kullanmanız önerilir. Diğerleri aynı API altında kullanılmasını belirtmiştik

bundle install 
bundle exec ruby builder.rb 

dişlisi entegrasyon/raf entegrasyonu, tesisat uzak abstracting: Çalıştırmak zorunda kalacak derlemek için

source 'http://production.cf.rubygems.org' 

gem 'opal', github: 'opal/opal' 

: İşte Opal ustası alma için Gemfile olduğunu .


Güncelleme: yığınında doğru satır numaralarını sahip olduğundan

, programlama yoluyla yığını ayrıştıracak ve bir değişkene bu satır numarası ayıklamak için oldukça geçerli:

require('./opal_lib'); 
require('source-map-support').install(); 
var $e = null; 
try { 
    require('./build'); 
} catch (e) { 
    $e = e; 
} 
var lines = e.split('\n').map(function(line){ return line.match(/^.*\((\S+):(\d+):(\d+)\)/) }) 

var first_source_line; 

for (var i = 0; i < lines.length ; i++) { 
    var match = lines[i]; 
    if (match == null) continue; 
    if (match[1].match(/index.rb$/) { 
    first_source_line = match; 
    break; 
    } 
} 

var line_number; 
if (first_source_line) line_number = first_source_line[2] // ==> 8 

Ve Tabii ki bunu da yakut yapabilirsiniz (ancak tarayıcıda çalıştırıyorsanız, kaynak-harita-desteğini de buraya eklemelisiniz):

class Test 

    def initialize 

    end 

    def crash 
    print x 
    end 

end 

line_num = nil 
begin 
    Test.new.crash 
rescue => e 
    if line = e.backtrace.map{|line| line.match(/^.*\((\S+):(\d+):(\d+)\)/) }.compact.find{|match| match[1] =~ /index.rb$/ } 
    line_num = line[2] 
    end 
end 

puts "line_num => #{line_num}" # ==> 8 
+0

Bu satır numarasını bir değişkende saklamanın bir yolu var mı? Demek istediğim, Ruby'nin istisnasını bir şekilde yakalamak ve daha sonra kullanmak için saklamak (tarayıcı konsolunda yazdırmak yerine) – Voldemort

+0

Elbette: güncellemeyi en sonunda görün. – lorefnon