Code tagged with rubygems

Manage Gems within Capistrano

Posted by Chad Humphries about 1 year ago
require 'capistrano'
# Installs within Capistrano as the plugin _gem_.
# Prefix all calls to the library with gem.
# Manages installing gems and versioned gems.
module GemInstaller

  # Default install command
  #
  # * doesn't install documentation
  # * installs all required dependencies automatically.
  #
  GEM_INSTALL="gem install -y --no-rdoc"

  # Upgrade the *gem* system to the latest version. Runs via *sudo*
  def update_system
    sudo "gem update --system"
  end

  # Updates all the installed gems to the latest version. Runs via *sudo*.
  # Don't use this command if any of the gems require a version selection.
  def upgrade
    sudo "gem update --no-rdoc"
  end

  # Removes old versions of gems from installation area.
  def cleanup
    sudo "gem cleanup" 
  end

  # Installs the gems detailed in +packages+, selecting version +version+ if
  # specified.
  #
  # +packages+ can be a single string or an array of strings.
  #  
  def install(packages, version=nil)
    sudo "#{GEM_INSTALL} #{if version then '-v '+version.to_s end} #{packages.to_a.join(' ')}"
  end

  # Auto selects a gem from a list and installs it.
  #
  # *gem* has no mechanism on the command line of disambiguating builds for
  # different platforms, and instead asks the user. This method has the necessary
  # conversation to select the +version+ relevant to +platform+ (or the one nearest
  # the top of the list if you don't specify +version+).
  def select(package, version=nil, platform='ruby')
    selections={}
    cmd="#{GEM_INSTALL} #{if version then '-v '+version.to_s end} #{package}"
    sudo cmd do |channel, stream, data|
      data.each_line do | line |
  case line
  when /\s(\d+).*\(#{platform}\)/
    if selections[channel[:host]].nil?
      selections[channel[:host]]=$1.dup+"\n"
      logger.info "Selecting #$&", "#{stream} :: #{channel[:host]}"
    end
  when /\s\d+\./
    # Discard other selections from data stream
  when /^>/
    channel.send_data selections[channel[:host]]
    logger.debug line, "#{stream} :: #{channel[:host]}"
  else
    logger.info line, "#{stream} :: #{channel[:host]}"
  end
      end
    end
  end

end

Capistrano.plugin :gem, GemInstaller
Language Ruby / Tagged with capistrano, rubygems, rails

Autoloading Gems in Vendor

# When developing a new Rails application if you gem unpack [gem] each of the gems 
# you are using in the vendor directory you will have to explicitly require them. 

# To resolve this maintenance pain put the following code in environment.rb.

Dir[File.dirname(__FILE__) + "/../vendor/*"].each do |path|
  gem_name = File.basename(path.gsub(/-\d+.\d+.\d+$/, ''))
  gem_path = path + "/lib/" + gem_name + ".rb"
  require gem_path if File.exists? gem_path
end
Language Ruby / Tagged with rails, rubygems