[英]Ruby gems in stand-alone ruby scripts
這是一個非常基本的紅寶石寶石問題。 我很熟悉編寫這樣的簡單ruby腳本:
#!/usr/bin/ruby
require 'time'
t = Time.at(123)
puts t
現在我想在我的腳本中使用我自己的ruby gem。 在我的rails項目中,我可以簡單地require 'my_gem'
。 但是,這在獨立腳本中不起作用。 在獨立的ruby腳本中使用我自己的gem的最佳/正確方法是什么?
您應該能夠直接在最新版本的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解釋器,這將具有相同的效果。
也可以看看:
你可以使用這樣的東西。 如果它尚未安裝,它將安裝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'
安裝具有以下內容的寶石應該可行。 請注意寶石是應該作為系統ruby還是用戶的一部分安裝。
#!/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'
...
我不確定我是否理解你的問題,但也許你沒有寶石,即使你寫它(你是初學者,所以也許你誤解了寶石的概念)。
只是為了確定:你有寶石的gemspec? 如果沒有,那么你沒有寶石,只有一個腳本。
如果您希望自己的腳本在另一個腳本中,您可以這樣做:
require 'my_script'
使用ruby 1.8,如果my_script.rb
與主腳本位於同一文件夾中,則可以正常工作。 使用ruby 1.9+,您可以使用:
require_relative 'my_script'
在這種情況下不需要寶石。
需要注意的是, bundler
本身可以處理這個問題。 它特別有趣,因為bundler
默認從2.6版開始附帶Ruby,你不需要再手動安裝它。
這個想法是:
bundler/inline
, gemfile
方法,並在塊中聲明所需的gem,就像在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網站上找到:bundler在單個文件ruby腳本中
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.