簡體   English   中英

獨立的ruby腳本中的Ruby gem

[英]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,你不需要再手動安裝它。

這個想法是:

  1. 要求在腳本頂部使用bundler/inline
  2. 使用gemfile方法,並在塊中聲明所需的gem,就像在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網站找到:bundler在單個文件ruby腳本中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM