I just uploaded the first version of my .gem-based Rails application
installer
to Rubyforge (http://rubyforge.org/projects/rails-installer/; gem
install
rails-app-installer). This is extracted from Typo 4.0, and it’s intended
to
make it easy to build user-friendly installers for Rails applications.
This isn’t intended to compete with Capistrano; it’s much
lighter-weight, and
aimed towards normal users installing applications, not production
deployments
of internally-developed software.
Here’s what users need to do to install an app via this installer:
$ sudo gem install my-app
$ my-app install /some/path
or, without root:
$ gem install -i ~/gems my-app
$ ~/gems/bin/my-app install /some/path
This will build a working Typo install in /some/path, using Mongrel and
SQLite3 by default. These can both be changed via configuration
settings; see
recent articles on http://scottstuff.net for details.
Here’s what you’ll need to do to add the installer to your existing
Rails app:
- Create a
.gem
that depends onrails-app-installer
,rails
, and
all
other.gem
s that you need to have installed. - Add an
executable
entry to your gemspec. If your app is called
my-app
, then addexecutable = ['my-app']
. - Copy the ‘rails_app_installer.yml’ file from the rails-app-installer
.gem
into a directory called ‘installer’ in your application. - Finally, create
bin/my-app
, using one of the examples in the
rails-app-installer
SVN tree as an example.
Here’s a short example bin/my-app
:
#!/usr/bin/env ruby
require 'rubygems'
require 'rails-installer'
class AppInstaller < RailsInstaller
application_name 'my_app'
support_location 'my website'
rails_version '1.1.4'
end
# Installer program
directory = ARGV[1]
app = AppInstaller.new(directory)
app.message_proc = Proc.new do |msg|
STDERR.puts " #{msg}"
end
app.execute_command(*ARGV)
That’s all that’s needed–as long as the installer gem is installed,
this will
give you a full installer that supports installs, upgrades, db backups
and
restores, and all of the other things that the Typo installer currently
provides. Adding application-specific installer subcommands is easy.
Here’s
the sweep_cache
implementation from Typo’s installer:
class SweepCache < RailsInstaller::Command
help "Sweep Typo's cache"
def self.command(installer, *args)
installer.sweep_cache
end
end
That’s all that’s needed to implement the typo sweep_cache /some/path
installer command. Er, except for adding a ‘sweep_cache’ method to
AppInstaller, but that’s up to you :-).