2010-06-24 13 views
2
Normalement

à utiliser les bibliothèques Ruby de ligne de commande que je peux faire quelque chose comme:Rubygems plus faciles à partir de la ligne de commande?

ruby -rfastercsv -e 'code' 

Malheureusement, cela ne fonctionne pas avec rubygems, car ils ne sont pas activés par défaut, et tout ce rubygems fait pour remplacer require n » t semblent fonctionner avec -r interrupteur, donc je suis obligé de le faire à la place:

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

assez gênant pour un one-liner - 42 caractères de tête par rapport à seulement 13 pour les bibliothèques non RubyGems. Y a-t-il un moyen d'éviter cela?

j'ai écrit ce script pour contourner le problème (il fonctionne comme -e "code" multiples sont autorisés, et require est idempotent donc il ne doit pas interférer avec -p/-n ou toute autre chose pour autant que je peux dire), mais il est tout plutôt laid, et je ne me dérangerait pas une solution plus élégante:

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

La question principale pourquoi 'Ruby -rubygems -rfastercsv' ne fonctionne pas, est que RubyGems remplace' 'require' et - r' n'utilise pas la méthode ruby ​​'require'. –

Répondre

0

Ma première tentative (ci-dessus) ne fonctionne qu'avec -e. Cela ne fonctionnerait pas avec des scripts dans des fichiers tels que ruby -rfoo bar.rb. Ce script prend en charge à la fois par la ruse auto nécessitant (son nom de fichier doit se terminer par .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 
Questions connexes