2008-09-23 22 views
6

Gần đây tôi đã chuyển một thư viện ruby ​​để một viên ngọc, mà dường như để phá vỡ khả năng sử dụng dòng lệnhThiết bị chuyển mạch dòng lệnh ruby ​​-rubygems & -r không tương thích?

Làm việc tốt như một thư viện

$ ruby -r foobar -e 'p FooBar.question' # => "answer" 

Và như một viên ngọc, IRB biết làm thế nào để đòi hỏi một viên ngọc từ lệnh line chuyển

$ irb -rubygems -r foobar 
    irb(main):001:0> FooBar.question # => "answer" 

Nhưng cùng thất bại cho ruby ​​tự:

$ ruby -rubygems -r foobar -e 'p FooBar.question' 
    ruby: no such file to load -- foobar (LoadError) 

phải bây giờ tôi làm điều này, mà có vẻ xấu xí:

ruby -rubygems -e 'require "foobar"; p FooBar.question' # => "answer" 

Hoặc là có một cách để làm cho công việc 2 công tắc?

Note: Tôi biết viên ngọc có thể thêm một bin/chương trình cho mọi phương pháp hữu ích nhưng tôi không muốn làm ô nhiễm không gian tên dòng lệnh không cần thiết

Trả lời

7

-rubygems thực sự là giống như -r ubygems.

Nó không gây rối với đường dẫn tìm kiếm của bạn, theo như tôi hiểu, nhưng tôi nghĩ nó cũng không thêm bất cứ thứ gì vào đường dẫn tìm kiếm -r của bạn. Tôi có thể làm một việc như sau:

ruby -rubygems -r /usr/lib/ruby/gems/myhelpfulclass-0.0.1/lib/MyHelpfulClass -e "puts MyHelpfulClass" 

MyHelpfulClass.rb tồn tại trong thư mục lib được chỉ định ở trên.

Đó là loại hút, nhưng ít nhất nó chứng minh rằng bạn có thể có nhiều chỉ thị -r equire.

Như một cách giải quyết ít xấu xí hơn, bạn có thể thêm các mục bổ sung vào đường dẫn tìm kiếm thư viện ruby ​​(dấu hai chấm được phân cách bằng * nix, dấu chấm phẩy được phân tách trong cửa sổ).

export RUBYLIB=/usr/lib/ruby/gems/1.8/gems/myhelpfulclass-0.0.1/lib 
ruby -rubygems -r MyHelpfulClass -e "puts MyHelpfulClass" 

Nếu bạn không muốn gây rối với các biến môi trường, bạn có thể thêm một cái gì đó để con đường tải bản thân:

ruby -I /usr/lib/ruby/gems/1.8/gems/myhelpfulclass-0.0.1/lib \ 
    -rubygems -r MyHelpfulClass -e "puts MyHelpfulClass" 
+0

Bạn nói đúng (quan sát 'ubygems.rb' trong ruby ​​/ site_ruby/1.8), nhưng tại sao lại thất bại với 2 yêu cầu? Nó có thay đổi đường dẫn tải hay gì đó không? –

+0

Bộ chuyển đổi -rubygems có cần thiết ở đây không? Tôi có thể chỉ định -r MyHelpfulClass không có chuyển đổi -rubygems không? – Donato

0

Lưu ý: Vấn đề này tồn tại cho ruby ​​1.8, nhưng đã được giải quyết trong ruby 1.9.

Trên 1.8, nếu bạn chỉ định cả hai libs qua -r, ruby ​​sẽ cố tải mỗi thư viện mà không chú ý đến những thay đổi trong $LOAD_PATH. Nhưng rubygems thay đổi $LOAD_PATH để các viên đá quý có thể được tìm thấy.

Lý do hoạt động với irbirbkhông chú ý đến $LOAD_PATH thay đổi.

Thật không may, cách giải quyết tốt nhất mà tôi đã tìm thấy là sử dụng các hình thức tiết hơn:

ruby -rubygems -e 'require "foobar"; p FooBar.question' 

Cơn đau không làm tăng tuyến tính với số lượng libs tuy nhiên, nếu bạn sử dụng một iterator:

ruby -rubygems -e '%w(rake rspec).each{|r| require r }' 
Các vấn đề liên quan