2010-06-24 49 views
2

通常使用Ruby庫的命令行我可以這樣做:從命令行更簡單的rubygems?

ruby -rfastercsv -e 'code' 

不幸的是這並不RubyGems的工作,因爲他們不是默認啓用的,不管RubyGems的不覆蓋require沒有按」 Ť似乎與-r開關工作,所以我不得不這樣做,而不是:

ruby -e 'require "rubygems"; require "fastercsv"; code' 

很煩人的一個班輪 - 42個字符的開銷只有13非RubyGems的庫進行比較。有什麼辦法可以避免這種情況?

我寫這個劇本來解決這個問題(它可以作爲多個-e "code"是允許的,並且require是冪等的,因此不應該與-p/-n或其他任何東西,只要我可以告訴干擾),但它的所有比較難看,我也不會介意一個更優雅的解決方案:

args = [] 
until ARGV.empty? 
    arg = ARGV.shift 
    if arg =~ /\A-r(.*)\Z/ 
    args << "-e" << "require 'rubygems'; require '#{$1.empty? ? ARGV.shift : $1}'" 
    else 
    args << arg 
    end 
end 
exec "ruby", *args 
+0

的主要問題,爲什麼'紅寶石-rubygems -rfastercsv'不工作,是RubyGems的覆蓋'require'和' - r'不使用ruby'require'方法。 – 2010-06-24 18:18:50

回答

0

我第一次嘗試(上)只適用於-e。它不適用於ruby -rfoo bar.rb等文件中的腳本。這個腳本支持通過自我要求招(其文件名必須.rb結尾):

#!/usr/bin/env ruby 

if $0 == __FILE__ 
    args = [] 
    libs = [] 
    last_lib = nil 
    while arg = ARGV.shift 
    if arg == "--" 
     args << arg 
     args += ARGV 
     break 
    elsif arg =~ /\A-r(.*)\Z/ 
     libs << ($1.empty? ? ARGV.shift : $1) 
     last_lib = args.size 
    else 
     args << arg 
    end 
    end 
    if last_lib 
    libself = __FILE__.chomp(".rb") 
    ENV["RUBYGEMS_LIBS"] = libs.join(":") 
    args[last_lib, 0] = ["-r", libself] 
    end 
    exec "ruby", *args 
else 
    require "rubygems" 
    libs = ENV["RUBYGEMS_LIBS"]||"" 
    libs.split(":").each{|lib| 
    require lib 
    } 
end