From: Zev Blut Date: 2006-12-19T15:34:37+09:00 Subject: Strategies for writing Ruby applications to be easily distributed with RubyGems Hello, This is mostly a repost of ruby-talk[229723] with some clarifications and an appeal for ideas. I have recently attempted to write a RubyGem for the Saikuro project. Unfortunately, I have learned that there is a mismatch between how I wrote Saikuro and how RubyGems expects executables to work. I would like to know is are there any better or commonly followed ways of writing executables that work with RubyGems and other installation programs such as setup.rb ? Below are the differences between how I wrote Saikuro and what RubyGems does. 1) Saikuro uses the "if __FILE__ == $0" check before doing the "application work". When RubyGems creates a new gemified saikuro wrapper to call the real saikuro bin "$0" is the gemified saikuro and not the real one. Thus, by default nothing happens. For fun I cheated and commented out the "if __FILE__" check and replaced it with "if true". Saikuro will work with this change, but I then ran "saikuro -?" to get a usage message and found the next problem: 2) I was reading through the Programming Ruby book and found a part that showed how to use rdoc to create usage messages. I figured this might be better than my normal technique so I used it in Saikuro. This has caused a number of problems actually. * With the above cheat I get the gem message: -- /usr/bin/saikuro: invalid option -- ? This file was generated by RubyGems. The application 'Saikuro' is installed as part of a gem, and this file is here to facilitate running it. -- Which is not the usage message I wanted. My original goal was to keep Saikuro simple so that as a single file nothing complicated was needed. But now I suppose that should change. I am planning to move all logic above and "if __FILE__ == $0" block into a separate library file. Then add a require to this newly made file and remove the "if __FILE__" check logic to make the insides of the block automatically run. Next I will stop using rdoc usage and simply put the usage message in a method that outputs a String. Does this sound like a good strategy? Thanks, Zev