这是一个非常基本的红宝石宝石问题。我很熟悉编写这样简单的ruby脚本:
#!/usr/bin/ruby
require 'time'
t = Time.at(123)
puts t
现在我想在我的脚本中使用我自己的ruby gem。在我的rails项目中,我可以简单地require 'my_gem'
。但是,这在独立脚本中不起作用。 在独立的ruby脚本中使用我自己的gem的最佳/正确方法是什么?
答案 0 :(得分:26)
您应该可以直接在最新版本的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),则必须明确将此行放在加载gem的尝试之上:
require 'rubygems'
或者,您可以使用标志-rubygems
调用Ruby解释器,这将具有相同的效果。
另见:
答案 1 :(得分:8)
你可以使用这样的东西。如果它尚未安装,它将安装gem:
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 :(得分:2)
安装具有以下内容的宝石应该有效。请注意宝石是应该作为系统红宝石还是用户的一部分安装。
#!/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'
...
答案 3 :(得分:1)
我不确定我是否理解你的问题,但也许你没有宝石,即使你写它(你是初学者,所以也许你误解了宝石的概念)。
只是为了确定:你有宝石的gemspec?如果没有,那么你没有宝石,只有一个脚本。
如果您希望自己的脚本在另一个脚本中,您可以这样做:
require 'my_script'
使用ruby 1.8,如果my_script.rb
与主脚本位于同一文件夹中,则可以正常工作。使用ruby 1.9+,您可以使用:
require_relative 'my_script'
在这种情况下不需要宝石。
答案 4 :(得分:1)
请注意,bundler
本身可以处理此问题。尤其有趣,因为bundler
从2.6版开始默认随Ruby一起提供,您不再需要手动安装它。
想法是:
bundler/inline
,gemfile
方法,并在块内声明所需的宝石,就像在Gemfile
中所做的一样,例如:
require 'bundler/inline'
gemfile do
source 'https://rubygems.org'
gem 'rainbow'
end
# From here on, rainbow is available so I can
# print colored text into my terminal
require 'rainbow'
puts Rainbow('This will be printed in red').red
官方文档可以在bundler website: bundler in a single file ruby script
上找到