2010-06-24 50 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