Рубиновые жемчужины в автономных скриптах ruby - PullRequest
24 голосов
/ 11 февраля 2012

Это действительно простой вопрос о рубиновых камнях.Я знаком с написанием простых скриптов ruby, таких как:

#!/usr/bin/ruby
require 'time'
t = Time.at(123)
puts t

Теперь я хотел бы использовать свой собственный гем ruby ​​в моем скрипте.В моем проекте рельсов я могу просто require 'my_gem'.Однако это не работает в автономном скрипте. Какой самый лучший / правильный способ использовать мой драгоценный камень в автономном скрипте ruby?

Ответы [ 4 ]

26 голосов
/ 11 февраля 2012

Вы должны иметь возможность просто потребовать это напрямую в последних версиях Ruby.

# optional, also allows you to specify version
gem 'chronic', '~>0.6'

# just require and use it
require 'chronic'
puts Chronic::VERSION  # yields "0.6.7" for me

Если вы все еще используете Ruby 1.8 (который по умолчанию не требует RubyGems), вам придется явно поставить эту строку над попыткой загрузить гем:

require 'rubygems'

Кроме того, вы можете вызвать интерпретатор Ruby с флагом -rubygems, который будет иметь тот же эффект.

Смотри также:

8 голосов
/ 16 апреля 2013

Вы можете использовать что-то вроде этого.Он установит гем, если он еще не установлен:

def load_gem(name, version=nil)
  # needed if your ruby version is less than 1.9
  require 'rubygems'

  begin
    gem name, version
  rescue LoadError
    version = "--version '#{version}'" unless version.nil?
    system("gem install #{name} #{version}")
    Gem.clear_paths
    retry
  end

  require name
end

load_gem 'your_gem'
2 голосов
/ 23 января 2016

Установка гемов с чем-то вроде следующего должна работать.Помните, следует ли устанавливать гем как часть системного рубина или пользователя.

#!/usr/bin/env ruby

require 'rubygems'

def install_gem(name, version=Gem::Requirement.default)
  begin
    gem name, version
  rescue LoadError
    print "ruby gem '#{name}' not found, " <<
      "would you like to install it (y/N)? : "
    answer = gets
    if answer[0].downcase.include? "y"
      Gem.install name, version
    else
      exit(1)
    end
  end
end

# any of the following will work...
install_gem 'activesupport'
install_gem 'activesupport', '= 4.2.5'
install_gem 'activesupport', '~> 4.2.5'

# require as normal (since not all gems install & require with same name) ...
require 'active_support/all'

...
1 голос
/ 11 февраля 2012

Я не уверен, правильно ли я понял ваш вопрос, но, возможно, у вас нет драгоценного камня, даже если вы пишете его (вы новичок, поэтому, возможно, вы неправильно поняли понятие драгоценных камней).

Просто чтобы быть уверенным: у вас есть gemspec для вашего камня? Если нет, то у вас нет драгоценного камня, но есть один скрипт.

Если вы хотите, чтобы ваш собственный скрипт был внутри другого скрипта, вы можете просто сделать:

require 'my_script'

С ruby ​​1.8 это работает нормально, если my_script.rb находится в той же папке, что и ваш основной скрипт. С ruby ​​1.9+ вы можете использовать:

require_relative 'my_script'

В этом случае драгоценность не нужна.

...