# Rubygems: Install if not already installed

**URL:** <https://www.ruby-forum.com/t/rubygems-install-if-not-already-installed/91098>\
**Category:** Ruby\
**Created:** [April 4, 2007, 6:20pm UTC](https://www.ruby-forum.com/t/rubygems-install-if-not-already-installed/91098 "2007-04-04T18:20:31Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![runxc](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/3ec8ea/32.png) [@runxc](https://www.ruby-forum.com/u/runxc)\
**Post date:** [April 4, 2007, 6:20pm UTC](https://www.ruby-forum.com/t/rubygems-install-if-not-already-installed/91098/1 "2007-04-04T18:20:31Z")

</div>

One of the things that I’ve needed to do on several occasions is  
create scripts that will update an Ruby installation to include all  
the gems that a project requires. I first wrote a batch file with  
several calls to “gem install”. It worked, but it was somewhat slow,  
because it would reinstall all the gems. I really only wanted it to  
install a specified gem if it weren’t installed.

I finally went ahead, however, and wrote the code to only install the  
gems if necessary. Here it is.

module Gem

# Return a list of the versions of the specified gem that are

installed.  
def self.installed\_versions gem\_name  
cache.search(gem\_name).collect {|x| x.version.to\_s}  
end

# Return the version of the provided gem file name.

@@gem\_file\_regex = /^(._)-([^-]_).gem$/  
def self.file\_version gem\_file  
if @@gem\_file\_regex =~ gem\_file  
$2  
else  
nil  
end  
end

# Return the library name of the gem file.

def self.file\_gem\_name gem\_file  
if @@gem\_file\_regex =~ gem\_file  
$1  
else  
nil  
end  
end  
end

gem\_dir = File.dirname( **FILE** ) + ‘/gems’

desc “Install any gems from the local gems directory that are not  
already installed.”  
task ‘update-gems’ do  
Dir.chdir gem\_dir do  
Dir[’\*.gem’].each do | gem\_file |  
version = Gem::file\_version gem\_file  
name = Gem::file\_gem\_name gem\_file  
desc = “Gem #{name}, version #{version}”  
if Gem::installed\_versions(name).include? version  
puts “#{desc} already installed.”  
else  
if system “gem.bat install --local #{name}”  
puts “#{desc} installed.”  
else  
raise RuntimeError, “Unable to load #{desc}”  
end  
end  
end  
end  
end
