2012-02-11 121 views
20

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

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

现在我想在我的脚本中使用自己的ruby gem。在我的rails项目中,我可以简单地require 'my_gem'。但是,这不适用于独立脚本。 在独立的ruby脚本中使用我自己的宝石的最佳方式是什么?

回答

25

你应该能够简单地直接要求它在最新版本的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 

如果你仍然对红宝石1.8(不需要默认RubyGems的),你必须明确地把你上面的尝试这条线来加载宝石:

require 'rubygems' 

另外,您可以调用标记为-rubygems的Ruby解释器,这将具有相同的效果。

参见:

2

我不知道如果我理解正确你的问题,但也许你没有宝石,即使你写它(你是一个初学者,所以也许你误解了宝石的概念)。

只是可以肯定:你必须为你的创业板gemspec?如果没有,那么你就没有宝石,只有一个脚本。

如果想让其他脚本里面自己的脚本,你可能只是做:

require 'my_script' 

使用Ruby 1.8这工作得很好,如果my_script.rb是在同一文件夹作为你的主脚本。随着红宝石1.9 +你可以使用:

require_relative 'my_script' 

在这种情况下没有必要的宝石。

+0

这是一个宝石。它是更大的铁路项目的一部分。我宁愿不加载整个rails项目只是为了在我的脚本中使用这个gem。 – SundayMonday 2012-02-13 18:09:53

6

你可以使用这样的事情。它会安装宝石,如果它尚未安装:

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' 
1

安装宝石与下面的东西应该工作。请注意是否应该将宝石安装为系统红宝石或用户的一部分。

#!/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' 

...