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 ファイルからコードをロードできるようになる。
参考: