OCRA
参考:
larsch/ocra: One-Click Ruby Application Builder – GitHub
gem
参考:
ocra | RubyGems.org [Official]
使い方
参考:
OCRA を使って Ruby スクリプトを実行ファイル (.exe) に変換して配布する – Qiita
ocra による exe 化 | mirichi.github.io
ocra による Ruby の EXE 化 | 覚え書き (masamitsu-murase.blogspot.com)
ソースコードを隠蔽する
iseqloader.rb
を作成する。
require 'fiddle' class RubyVM class InstructionSequence addr = Fiddle.dlopen(nil)['rb_iseq_load'] fn = Fiddle::Function.new( addr, [Fiddle::TYPE_VOIDP] * 3, Fiddle::TYPE_VOIDP) define_singleton_method(:load) do |dat, par=nil, opt=nil| fn.call(Fiddle.dlwrap(dat), par, opt).to_value end end end alias old_require_relative require_relative def require_relative(filename) ext = File.extname(filename) base = File.basename(filename) if ext.empty? rbname = filename + ".rb" rbcname = filename + ".rbc" elsif ext == ".rb" rbname = filename rbcname = filename + "c" else old_require_relative(filename) return end if File.exists?(rbname) if !File.exists?(rbcname) or File.mtime(rbname) > File.mtime(rbcname) open(rbcname, "wb") do |fh| Marshal.dump(RubyVM::InstructionSequence.compile_file(rbname).to_a, fh) end end end if File.exists?(rbcname) open(rbcname, "rb") do |fh| RubyVM::InstructionSequence.load(Marshal.load(fh)).eval end else old_require_relative(filename) end end
require_relative 'iseqloader'
を実行すると、以降 require_relative
したコードに対応する .rbc ファイルが生成され、.rb ファイルの代わりに .rbc ファイルからコードをロードできるようになる。
参考: