--- date: "2004-08-25T14:44:12Z" title: Thoughts on RubyForge/RubyGems --- <p> In order to post a <a href='http://rubygems.rubyforge.org/'>RubyGem</a> at the moment, you have to create an account on <a href='http://www.rubyforge.org/'>RubyForge</a>, then create a project, <em>then</em> upload the gem. <a href='http://www.rubyforge.org/'>RubyForge</a> gives the same things that <a href='http://www.sourceforge.net/'>SourceForge</a> does; a web site, a <acronym title='Concurrent Versioning System'>CVS</acronym> repository, a file area, forums, mailing lists, kitchen sink, etc. Pros: <a href='http://www.rubyforge.org/'>RubyForge</a> is prettier, simpler, and more stable than <a href='http://www.sourceforge.net/'>SourceForge</a> (although I've seen Windows 95 machines that are more stable than <a href='http://www.sourceforge.net/'>SourceForge</a>, so that's not saying much). Also <a href='http://www.rubyforge.org/'>RubyForge</a> doesn't have 8 gadzillion dead projects on it, so it's significantly faster than <a href='http://www.sourceforge.net/'>SourceForge</a>. Cons: No automated interface (<acronym title='eXtensible Markup Language-Remote Procedure Call'>XML-RPC</acronym>, <acronym title='Simple Object Access Protocol'>SOAP</acronym>, email, smoke signals, etc... <a href='http://www.freshmeat.net/'>Freshmeat</a> has an <a href='http://freshmeat.net/articles/view/1048/'><acronym title='eXtensible Markup Language-Remote Procedure Call'>XML-RPC</acronym> interface</a>, so this isn't an unrealistic request), no quick way of creating a minimalist project (for example, a project that just classifies itself in the <a href='http://rubyforge.org/softwaremap/'>Trove</a> and posts a <a href='http://rubygems.rubyforge.org/'>gem</a>..ie, what I want to do), and no integration with <a href='http://raa.ruby-lang.org/'><acronym title='Ruby Application Archive'>RAA</acronym></a> or <a href='http://www.freshmeat.net/'>Freshmeat</a>. </p> <p> I want to elaborate on the last one a bit, because that's a problem with both <a href='http://www.rubyforge.org/'>RubyForge</a> and <a href='http://rubygems.rubyforge.org/'>RubyGems</a>. Let's look at the steps I take when I release the latest version of a <a href='http://www.ruby-lang.org/'>Ruby</a> binding: </p> <ol> <li>Sanity check, make sure the thing still compiles</li> <li>Run whatever testing script I have written, make sure I haven't broken anything crucial</li> <li>Update the documentation (README, TODO, BUGS, etc)</li> <li>Tag the release in <acronym title='Concurrent Versioning System'>CVS</acronym>. If I'm incrementing the major or minor number, then I create a new branch as well.</li> <li>Export the specified tag to anohter directory (I've got one called releases/ on my workstation).</li> <li>Double-check everything again to make sure things are where they should be (I catch a lot of stupid mistakes here, by the way).</li> <li>Run <a href='http://rdoc.sf.net/'>RDoc</a> to generate the developer documentation.</li> <li>Tar the release up.</li> <li>Sign the tarball with <a href='http://www.gnupg.org/'>GnuPG</a> (everyone should be doing this; shame on you if you aren't).</li> <li>Upload the tarball, signature, ChangeLog, and API documentation to <a href='/'>Pablotron</a>.</li> <li>Update the links, version number, and possibly the blurb on the software page.</li> <li>Post an entry to the front page briefly describing the release.</li> <li>Update the binding's entry on <a href='http://raa.ruby-lang.org/'><acronym title='Ruby Application Archive'>RAA</acronym></a>.</li> <li>Update the entry on <a href='http://www.freshmeat.net/'>Freshmeat</a>.</li> <li>Post a short message to <a href='http://www.ruby-talk.org/'><code>ruby-talk</code></a>.</li> </ol> <p> If I'm using creating a <a href='http://rubygems.rubyforge.org/'>gem</a>, then we have to add the following items to the list: </p> <ul> <li>Update <code>gemspec</code>.</li> <li>Create <a href='http://rubygems.rubyforge.org/'>gem</a>.</li> <li>Upload <a href='http://rubygems.rubyforge.org/'>gem</a> (and possibly release tarball, signature, etc), to <a href='http://www.rubyforge.org/'>RubyForge</a>.</li> <li>Update project information on <a href='http://www.rubyforge.org/'>RubyForge</a>.</li> </ul> <p> Well, if there was some interaction between <a href='http://www.rubyforge.org/'>RubyForge</a>, <a href='http://raa.ruby-lang.org/'><acronym title='Ruby Application Archive'>RAA</acronym></a>, and <a href='http://www.freshmeat.net/'>Freshmeat</a>, a lot of redundant steps could be eliminated. I'm picking on <a href='http://www.rubyforge.org/'>RubyForge</a> here because it's the new kid on the block; <a href='http://www.freshmeat.net/'>Freshmeat</a> has been around since the dawn of time, and <a href='http://raa.ruby-lang.org/'><acronym title='Ruby Application Archive'>RAA</acronym></a> has Ruby's semi-answer to <a href='http://www.perl.com/'>Perl's</a> <a hrf='http://www.cpan.org/'><acronym title='Comprehensive Perl Archive Network'>CPAN</acronym></a> since I started using <a href='http://www.ruby-lang.org/'>Ruby</a>. For example, let's say <a href='http://www.rubyforge.org/'>RubyForge</a> had an <acronym title='eXtensible Markup Language-Remote Procedure Call'>XML-RPC</acronym> interface, and it could communicate with <a href='http://raa.ruby-lang.org/'><acronym title='Ruby Application Archive'>RAA</acronym></a> (via some <acronym title='Remote Procedure Call'>RPC</acronym> interface) and <a href='http://www.freshmeat.net/'>Freshmeat</a>. Now write a script that creates a <a href='http://rubygems.rubyforge.org/'>gem</a> and does the necessary updates to my personal page, then connects to <a href='http://www.rubyforge.org/'>RubyForge</a> via <acronym title='eXtensible Markup Language-Remote Procedure Call'>XML-RPC</acronym> and uploads my tarball, <a href='http://rubygems.rubyforge.org/'>gem</a>, tarball signature, and gem signature, which are then automagically propogated to both <a href='http://www.freshmeat.net/'>Freshmeat</a> and the <a href='http://raa.ruby-lang.org/'><acronym title='Ruby Application Archive'>RAA</acronym></a>. </p> <p> In short, an automated update interface combined with the ability to interact with the other existing software indices would allow me to eliminate half of the steps on my software release checklist and make <a href='http://www.rubyforge.org/'>RubyForge</a> incredibly useful to developers, even if they don't need web hosting, a mailing list, or a <acronym title='Concurrent Versioning System'>CVS</acronym> repository. </p>