独立的ruby脚本中的Ruby gem

Sun*_*day 25 ruby gem ruby-on-rails

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

#!/usr/bin/ruby
require 'time'
t = Time.at(123)
puts t
Run Code Online (Sandbox Code Playgroud)

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

Jer*_*man 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
Run Code Online (Sandbox Code Playgroud)

如果您仍然使用Ruby 1.8(默认情况下不需要RubyGems),则必须明确将此行放在加载gem的尝试之上:

require 'rubygems'
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用-rubygems具有相同效果的标志调用Ruby解释器.

也可以看看:


Rob*_*jic 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'
Run Code Online (Sandbox Code Playgroud)


Pie*_*son 6

值得注意的是,bundler它本身可以处理这个问题。它特别有趣,因为bundler从 2.6 版本开始默认随 Ruby 一起提供,并且您不再需要手动安装它。

这个想法是:

  1. bundler/inline在脚本的顶部要求,
  2. 使用该gemfile方法,并在块内声明您需要的 gem,就像您在 a 中所做的那样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
Run Code Online (Sandbox Code Playgroud)

官方文档可以在bundler网站上找到:bundler in a single file ruby​​ script