I havent personally used this to distribute an application, but it sounds like it'll fit the bill: http://www.erikveen.dds.nl/allinoneruby/index.html Patrick Hurley wrote: > I have need to distribute applications to customers. The customers > have every right to the source code, but when it is installed we do > not want the code to be easily visible. We are not worried about super > hackers (or even moderately strong Ruby programmers :-), we just do > not want our raw source code on the system calling out to be played > with by the end users. > > To this end, I have developed this very simple script, which I plan on > further refining. I know there are many rough edges, but I wanted to > see if anyone else was interested in the code (or had any other > suggestions), before I went any further. > > require "zlib" > > @init = <<ZLIB_REQUIRE > module Kernel > alias default_require require > @@zlib_requires = {} > > def zlib_requires=(zr) > @@zlib_requires = zr > end > > def require(path) > return false if $".include?(path) > > if @@zlib_requires.has_key(path) > eval(Zlib::Inflate.inflate(@@zlib_requires[path])) > $" << path > else > default_require path > end > end > > end > ZLIB_REQUIRE > > @bootstrap = <<BOOTSTRAP > require "zlib" > File.open(__FILE__, "rb") do |data| > # skip to the end > line = data.gets until line =~ /^__END__$/ > f = Marshal.load(data) > eval(Zlib::Inflate.inflate(f[:init])) > Kernel.zlib_requires = f > eval(Zlib::Inflate.inflate(f[:main])) > end > __END__ > BOOTSTRAP > > def findrb(fname) > $:.each do |path| > fp = File.join(path, fname) > return fp if File.exists? fp > end > false > end > > def compress(script) > files = {} > load(script) rescue nil > > $".each do |fname| > if (File.extname(fname) == ".rb") && (fp = findrb(fname)) > data = IO.read(fp) > files[fname] = Zlib::Deflate.deflate(data, Zlib::BEST_COMPRESSION) > end > end > > files[:main] = Zlib::Deflate.deflate(IO.read(script), Zlib::BEST_COMPRESSION) > files[:init] = Zlib::Deflate.deflate(@init, Zlib::BEST_COMPRESSION) > > File.open("compress-#{script}", "wb") do |io| > io.print @bootstrap > io.write(Marshal.dump(files)) > end > > # write header data - fname, > end > > compress(ARGV[0])