独立的ruby脚本中的Ruby gem

时间:2012-02-11 00:28:11

标签: ruby-on-rails ruby gem

这是一个非常基本的红宝石宝石问题。我很熟悉编写这样简单的ruby脚本:

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

现在我想在我的脚本中使用我自己的ruby gem。在我的rails项目中,我可以简单地require 'my_gem'。但是,这在独立脚本中不起作用。 在独立的ruby脚本中使用我自己的gem的最佳/正确方法是什么?

5 个答案:

答案 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一起提供,您不再需要手动安装它。

想法是:

  1. 在脚本顶部要求bundler/inline
  2. 使用gemfile方法,并在块内声明所需的宝石,就像在Gemfile中所做的一样,
  3. 本节结束后,您的宝石就可以使用了!

例如:

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

上找到