web-dev-qa-db-ja.com

Rubyスタンドアロンのgems Rubyスクリプト

これは本当に基本的なRuby gemsの質問です。私は次のような単純なRubyスクリプトの記述に精通しています:

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

ここで、スクリプトで自分のRuby gemを使用したいと思います。私のRailsプロジェクトでは、単純にrequire 'my_gem'。ただし、これはスタンドアロンスクリプトでは機能しません。 スタンドアロンで自分のgemを使用するための最良/適切な方法は何ですかRubyスクリプト?

26
SundayMonday

最近のバージョンの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インタプリタを呼び出すこともできます。これは同じ効果があります。

参照:

26
Jeremy Roman

あなたはこのようなものを使うことができます。まだインストールされていない場合は、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'
8
Robert Kajic

次のようなgemをインストールすると機能するはずです。 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'

...
2
ives

bundler自体がこれに対処できることに注意してください。 bundlerはバージョン2.6以降、デフォルトでRubyに付属しており、手動でインストールする必要がないため、特に興味深いものです。

アイデアは次のとおりです。

  1. 要求する bundler/inlineスクリプトの上部に、
  2. gemfileメソッドを使用し、Gemfileで行うように、ブロック内で必要なgemを宣言するには、
  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のWebサイト:単一ファイル内のbundler Rubyスクリプト にあります。

あなたの質問を正しく理解したかどうかはわかりませんが、書いても宝石を持っていない可能性があります(あなたは初心者なので、宝石の概念を誤解している可能性があります)。

念のため:あなたの宝石の宝石仕様はありますか?そうでない場合は、宝石はありませんが、スクリプトは1つです。

別のスクリプト内に独自のスクリプトが必要な場合は、次のようにします。

require 'my_script'

Ruby 1.8の場合、my_script.rbはメインスクリプトと同じフォルダにあります。 Ruby 1.9+を使用すると、次のものを使用できます。

require_relative 'my_script'

この場合、宝石は必要ありません。

1
knut