Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
It’s about time to pack Ruby and Ruby scripts ...
Search
ahogappa
May 16, 2024
Programming
1
4.7k
It’s about time to pack Ruby and Ruby scripts in one binary
ahogappa
May 16, 2024
Tweet
Share
More Decks by ahogappa
See All by ahogappa
RubyKaigi 2024 followup
ahogappa0613
0
40
Other Decks in Programming
See All in Programming
Amazon Bedrock Agentsを用いてアプリ開発してみた!
har1101
0
330
as(型アサーション)を書く前にできること
marokanatani
9
2.6k
AI時代におけるSRE、 あるいはエンジニアの生存戦略
pyama86
6
1.1k
C++でシェーダを書く
fadis
6
4.1k
型付き API リクエストを実現するいくつかの手法とその選択 / Typed API Request
euxn23
8
2.2k
Nurturing OpenJDK distribution: Eclipse Temurin Success History and plan
ivargrimstad
0
870
Why Jakarta EE Matters to Spring - and Vice Versa
ivargrimstad
0
1k
광고 소재 심사 과정에 AI를 도입하여 광고 서비스 생산성 향상시키기
kakao
PRO
0
170
Better Code Design in PHP
afilina
PRO
0
120
役立つログに取り組もう
irof
28
9.6k
Macとオーディオ再生 2024/11/02
yusukeito
0
370
TypeScriptでライブラリとの依存を限定的にする方法
tutinoko
2
660
Featured
See All Featured
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
42
9.2k
Rebuilding a faster, lazier Slack
samanthasiow
79
8.7k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.4k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
229
52k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
10
720
Documentation Writing (for coders)
carmenintech
65
4.4k
Visualization
eitanlees
145
15k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
246
1.3M
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
16
2.1k
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
Building an army of robots
kneath
302
43k
Testing 201, or: Great Expectations
jmmastey
38
7.1k
Transcript
It’s about time to pack Ruby and Ruby scripts in
one binary RubyKaigi 2024 ahogappa
About me • Sho Hirano(@ahogappa) • STORES, Inc. • #FFF613
2
What’s one binary? 3
What’s one binary? Works perfectly with just one file 4
Why one binary? 5
Why one binary in Ruby? 6
Why one binary in Ruby? e.g. distributing a Ruby project
7
Why one binary in Ruby? 💻 💻 developer user 8
Why one binary in Ruby? 💻 a.rb a.rb a.rb a.rb
💻 developer user 9
Why one binary in Ruby? 💻 a.rb a.rb a.rb a.rb
💻 Ruby 3.3.0 Sinatra 4.0.0 Sqlite3 2.0.1 developer user 10
Why one binary in Ruby? 💻 a.rb a.rb a.rb a.rb
💻🚫 Ruby 3.3.0 Sinatra 4.0.0 Sqlite3 2.0.1 Ruby 3.0.0 Sinatra 3.2.0 Sqlite3 Not installed developer user 11
Why one binary in Ruby? 💻 💻 Ruby 3.3.0 Sinatra
4.0.0 Sqlite3 2.0.1 developer user 12 Ruby 3.0.0 Sinatra 3.2.0 Sqlite3 Not installed
Why one binary in Ruby? 💻 💻 one binary developer
user Ruby 3.3.0 Sinatra 4.0.0 Sqlite3 2.0.1 13 Ruby 3.0.0 Sinatra 3.2.0 Sqlite3 Not installed
Why one binary in Ruby? 💻 💻✔ one binary Ruby
3.3.1 Sinatra 4.0.0 Sqlite3 2.0.1 a.rb a.rb a.rb a.rb developer user Ruby 3.3.1 Sinatra 4.0.0 Sqlite3 2.0.1 14 Ruby 3.0.0 Sinatra 3.2.0 Sqlite3 Not installed
Any existing tools? 15
Any existing tools? • ocra(ocran) • exerb • ruby2exe •
ruby-packer 16
🤔 Existing tools look good and useful 17
Existing tools look good and useful, but • No support
for 3.0+ • Patches Ruby • Windows only • Write temporary files 18
Time to make new one! 😄 19
Done 🔧 20
Kompo 📦 21
Kompo • 梱包(こんぽう) ◦ Means packaging, packing • A word
play on “compo” ◦ compose ◦ component ◦ composite ◦ etc… 22 https://github.com/ahogappa0613/kompo
Demo One binary with Sinatra and Sqlite3 23
Features 24
Features • Monkey patch only, not patching Ruby • No
write temporary files • Supports Gemfile • Reads local file as a fallback when failing to read from vfs 25
Demo Reads local file as a fallback when failing to
read from vfs 26
How kompo works 27
How kompo works • Ruby scripts are embedded • Patch
methods that read Ruby scripts ◦ Kernel#require ◦ Kernel#require_relative ◦ Kernel#load ◦ Kernel#autoload, Module#autoload • Native extensions are statically linked 28
29 libruby-static.a
30 libruby-static.a native extensions
main.c 31 libruby-static.a native extensions void Init_gems(void) { ruby_init_ext( "puma/puma_http11.so",
Init_puma_http11 ); ruby_init_ext( "sqlite3/sqlite3_native.so", Init_sqlite3_native ); } int main(int argc, char **argv) { ruby_sysinit(&argc, &argv); ruby_init(); Init_gems(); Init_kompo_fs(); … return ruby_run_node(node); }
main.c 32 kompofs.o +patches libruby-static.a native extensions
33 class Kompo def get_file(abs_path) # return the ruby script
from kompofs(.o) end … end main.c libruby-static.a native extensions kompofs.o +patches libkompo.a
main.c libkompo.a 34 libruby-static.a kompofs.o +patches native extensions one binary
compile and link libruby-static.a
Patches 35
Patches libruby-static.a main.rb b.rb d.rb a.rb Kernel#require Kernel#require_relative c.so 36
Patches libruby-static.a main.rb b.rb d.rb a.rb Kernel#require Kernel#require_relative c.so $
cd /workspace/sample $ kompo a.rb b.rb 37
Patches libruby-static.a main.rb b.rb Kernel#require Kernel#require_relative d.rb a.rb c.so 38
kompofs.o
Patches Ruby main.rb b.rb Kernel#require Kernel#require_relative c.o d.rb a.rb one
binary libkompo.a 39 main.c kompofs.o
Patches Ruby main.rb b.rb 🪡Kernel#require 🪡Kernel#require_relative c.o d.rb a.rb one
binary libkompo.a 40 module Kernel def require(path) eval(Kompo.get_file(path)) rescue => LoadError original_require(path) main.c kompofs.o
Patches Ruby main.rb b.rb 🪡Kernel#require 🪡Kernel#require_relative c.o d.rb a.rb one
binary require ‘a’ require_relative ‘./b’ require ‘c’ require ‘d’ libkompo.a 41 module Kernel def require(path) eval(Kompo.get_file(path)) rescue => LoadError original_require(path) main.c kompofs.o
Patches Ruby main.rb b.rb 🪡Kernel#require 🪡Kernel#require_relative c.o d.rb a.rb one
binary libkompo.a 42 module Kernel def require(path) eval(Kompo.get_file(path)) rescue => LoadError original_require(path) kompofs.o require ‘a’ require_relative ‘./b’ require ‘c’ require ‘d’ main.c
Future Works 43
Future Works • Support ways for users to access kompofs
freely • Cross-compilation • File compression 44
Let’s kompo Ruby! 45
Thank you!! 46