Проще рубины из командной строки? - PullRequest
2 голосов
/ 24 июня 2010

Обычно для использования библиотек Ruby из командной строки я могу сделать что-то вроде:

ruby -rfastercsv -e 'code'

К сожалению, это не работает с rubygems, так как они не включены по умолчанию, и все, что rubygems делает для переопределенияrequire, похоже, не работает с переключателем -r, поэтому я вынужден сделать это вместо этого:

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

Довольно раздражает однострочная - 42 символа служебных данных по сравнению с 13для библиотек без рубинов.Есть ли способ избежать этого?

Я написал этот скрипт, чтобы обойти проблему (он работает так, как допускается несколько -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

1 Ответ

0 голосов
/ 29 июля 2010

Моя первая попытка (выше) работает только с -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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...