July 2006
Publising Rails Plug-ins with Rake
Problem: The Ruby on Rails plug-in installer's RecursiveHTTPFetcher makes certain assumptions about web servers that does not hold true from server to server. For example, it assumes:
- The web server has "file browsing" enabled
- All links to plug-in files are relative
- Folder links end with a forward slash
RubyForge web server is an example of where these assupmtions don’t hold true. As a result, you can not simply copy your files to a web server and expect Rails HTTP plugin installer to just work.
Solution: Rails Plug-in Package Task
RailsPluginPackageTask is a Rake task designed to automate the publishing of Ruby on Rails plug-ins. It helps fill the gap by conforming to the Rails plug-in script's assumptions. Following the Rake package task conventions, it defines the "rails_plugin" task that recurses through your package_files, generates compliant index.html for each folder (that contains a file), and creates a directory structure that you can publish as a set for your plugin.
Example
The following example uses the Rake::RailsPluginPackageTask to create the package. It then uses the Rake::SshDirPublisher to publish the plugin directory to RubyForge.
-
Rake::RailsPluginPackageTask.new(ProjectInfo[:name], ProjectInfo[:version]) do |p|
-
p.package_files = PluginPackageFiles
-
p.plugin_files = FileList["rails_plugin/**/*"]
-
p.extra_links = {"Project page"=>ProjectInfo[:homepage],
-
"Author: #{ProjectInfo[:author_name]}"=>ProjectInfo[:author_link]}
-
p.verbose = true
-
end
-
task :rails_plugin=>:clobber
-
-
desc "Publish Ruby on Rails plug-in on RubyForge"
-
task :release_plugin=>:rails_plugin do |task|
-
pub = Rake::SshDirPublisher.new("#{RubyForgeConfig[:user_name]}@rubyforge.org",
-
"/var/www/gforge-projects/#{RubyForgeConfig[:unix_name]}",
-
"pkg/rails_plugin")
-
pub.upload()
-
end
You can download the ZIP package for this task and place it in your gems or project folder. For a complete working example, checkout ROXML from CVS.
Note: This release has only been tested on Linux. If it doesn't work on your OS, please let me know.