Gemmes Ruby dans des scripts Ruby autonomes

C'est une question ruby gems vraiment basique. Je suis familier avec l'écriture de scripts ruby simples comme ceci:

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

Maintenant, je voudrais utiliser ma propre gemme ruby dans mon script. Dans mon projet rails, je peux simplement require 'my_gem'. Toutefois, cela ne fonctionne pas dans un script autonome. Quelle est la meilleure façon d'utiliser ma propre gemme dans un script ruby autonome?

23
demandé sur ThinkingStiff 2012-02-11 04:28:11

4 réponses

Vous devriez pouvoir simplement l'exiger directement dans les versions récentes de 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

Si vous êtes toujours sur Ruby 1.8 (qui ne nécessite pas de RubyGems par défaut), vous devrez explicitement mettre cette ligne au-dessus de votre tentative de chargement de la gemme:

require 'rubygems'

Alternativement, vous pouvez invoquer l'interpréteur Ruby avec le drapeau -rubygems qui aura le même effet.

Voir aussi:

27
répondu Jeremy Roman 2012-02-11 00:48:04

Vous pourriez utiliser quelque chose comme ça. Il installera la gemme si elle n'est pas déjà installée:

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
répondu Robert Kajic 2013-04-16 17:31:11

Installer des gemmes avec quelque chose comme ce qui suit devrait fonctionner. Gardez à l'esprit si les gemmes doivent être installées dans le cadre du système ruby ou d'un utilisateur.

#!/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
répondu ives 2016-01-23 08:58:26

Je ne suis pas sûr d'avoir bien compris votre question, mais peut-être que vous n'avez pas de gemme, même si vous l'écrivez (vous êtes un débutant, alors peut-être avez-vous mal compris le concept de gemmes).

Juste pour être sûr: Vous avez un gemspec pour votre bijou? Si non, alors vous n'avez pas de gemme, mais un seul script.

Lorsque vous voulez votre propre script dans un autre script, vous pouvez simplement faire:

require 'my_script'

Avec ruby 1.8 cela fonctionne bien, si my_script.rb est dans le même dossier que votre script principal. Avec ruby 1.9 + vous peut utiliser:

require_relative 'my_script'

Il n'y a pas besoin d'une gemme dans ce cas.

2
répondu knut 2017-01-31 14:24:57