Это действительно базовый вопрос о ruby gems. Я знаком с написанием простых скриптов ruby, таких как этот:
#!/usr/bin/ruby
require 'time'
t = Time.at(123)
puts t
Теперь я хотел бы использовать свой собственный гем ruby в своем скрипте. В моем проекте rails я могу просто require 'my_gem'
. Однако это не работает в отдельном скрипте. Какой лучший/правильный способ использовать мой собственный гем в отдельном скрипте на ruby?
Вы должны иметь возможность просто потребовать это напрямую в последних версиях 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
, который будет иметь тот же эффект.
См. Также:
Вы можете использовать что-то вроде этого. Он установит драгоценный камень, если он еще не установлен:
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'
Я не уверен, правильно ли я понял ваш вопрос, но, возможно, у вас нет драгоценного камня, даже если вы пишете его (вы новичок, поэтому, возможно, вы неправильно поняли понятие драгоценных камней).
Просто чтобы быть уверенным: у вас есть драгоценный камень для вашего драгоценного камня? Если нет, то у вас нет драгоценного камня, но есть один скрипт.
Если вы хотите, чтобы ваш собственный скрипт находился внутри другого скрипта, вы можете просто сделать:
require 'my_script'
С ruby 1.8 это работает нормально, если my_script.rb
находится в той же папке, что и ваш основной скрипт. С ruby 1.9+ вы можете использовать:
require_relative 'my_script'
В этом случае драгоценность не нужна.