Building & Installing GemSpecs
Author: Samuel Williams When: Wednesday, 24 February 2010April 2009
May 2009
August 2009
September 2009
October 2009
- Building a Concrete Bath
- LED Lighting Comparison
- Thinking about Programming Languages
- How To Be A Consultant
- Lucid Programming Dojo
- Exim4 + ClamAV + SpamAssassin
- Secure login using AJAX
- Ramaze And Rack
- ActiveMerchant
- Concurrency And Immutability
- Floating Point Numbers
- Programming And Debugging
- Useful jQuery Plugins
- Loading Anonymous Ruby Classes
- 尺八 (Shakuhachi)
- Card Trick
- Object Oriented C
- Gemcutter
- Writing Clearly
- Richard Stallman In Christchurch
- Magnatune
- Client Side Graphing
- Zena CMS
November 2009
February 2010
March 2010
April 2010
May 2010
June 2010
July 2010
August 2010
September 2010
December 2010
January 2011
March 2011
May 2011
August 2011
September 2011
I have created a very simple script to automate the process of building and installing gems. It is very easy to use and makes it easy to test code prior to deployment to a gem server.
build/Rakefile
This file should require little or no customization.
# Automatic Gem Build Script v2.0
require 'fileutils'
require 'rubygems'
MasterGemspec = "gemspec.master"
desc 'Build a gemspec file'
task :build_gemspec do
$spec = Gem::Specification.load(MasterGemspec)
$versioned_gem = "#{$spec.name}-#{$spec.version}.gem"
$versioned_gemspec = "#{$spec.name}-#{$spec.version}.gemspec"
$base_gemspec = "#{$spec.name}.gemspec"
puts "Building #{$versioned_gemspec}..."
File.open($versioned_gemspec, "w") do |f|
f.write($spec.to_ruby)
end
puts "Copying file to ../#{$base_gemspec}"
FileUtils.cp($versioned_gemspec, "../#{$base_gemspec}")
end
task :build_gem => [:build_gemspec] do
Dir.chdir("../") do
system("gem build #{$base_gemspec}")
end
end
task :install_gem => [:build_gem] do
Dir.chdir("../") do
system("gem install --local #{$versioned_gem}")
end
end
build/gemspec.master
This file will require almost every field to be changed, depending on your project, dependencies, etc.
Dir.chdir("../") do
require 'lib/utopia/version'
Gem::Specification.new do |s|
s.name = "utopia"
s.version = Utopia::VERSION::STRING
s.author = "Samuel Williams"
s.email = "samuel.williams@oriontransfer.co.nz"
s.homepage = "http://www.oriontransfer.co.nz/software/utopia"
s.platform = Gem::Platform::RUBY
s.summary = "Utopia is a framework for building websites."
s.files = FileList["{ext,lib}/**/*"].to_a
s.require_path = "lib"
s.add_dependency("mime-types")
s.add_dependency("rack")
# Dates and Times, etc
s.add_dependency("activesupport")
s.add_dependency("rack-cache")
s.add_dependency("rack-contrib")
s.add_dependency("rmagick")
# s.extensions << "ext/xnode/extconf.rb"
end
end
lib/[project-name]/version.rb
This file needs to have your project's current version in it. This controls the version in the GemSpec file.
module Utopia # Replace this with your own gem name
module VERSION
MAJOR = 0
MINOR = 9
TINY = 15
STRING = [MAJOR, MINOR, TINY].join('.')
end
end
Usage
Basically, when you create a gem, it will have a file layout similar to the following:
[gem-name]/ build/gemspec.master (as above, but modified to suit your project) build/Rakefile (as above) lib/[gem-name].rb lib/[gem-name]/version.rb lib/[gem-name]/[other-src-files]
To install the gem, simply run sudo rake install_gem from the build directory:
$ sudo rake install_gem (in ./utopia/build) Building utopia-0.9.14.gemspec... Copying file to ../utopia.gemspec WARNING: no description specified WARNING: no rubyforge_project specified Successfully built RubyGem Name: utopia Version: 0.9.14 File: utopia-0.9.14.gem Successfully installed utopia-0.9.14 1 gem installed Installing ri documentation for utopia-0.9.14... Installing RDoc documentation for utopia-0.9.14...
This will, along with installing the gem, produce a working gem and gemspec file in the root directory. In this case, utopia-0.9.14.gem and utopia.gemspec. These can be used for automatic build and deployment tasks via a git post-commit hook, for example. My server automatically compiles and installs the latest gem using this process.
Comments
Please note, you can leave a comment that uses (limited) XHTML and Textile syntax.