ããã«ã¡ã¯ïŒ Findy Team+ éçºããŒã ã§EMãããŠãã ham ã§ãã ä»å¹ŽãRubyKaigi 2025ã«åå ããŠããŸããã ç§ã¯ã³ããåŸã«äžéçã§éå¬ããããšããã4幎é£ç¶ã§åå ããŠããã®ã§ãããä»å¹Žãè峿·±ãã»ãã·ã§ã³ããããããããRubyãçå®ã«é²åããŠããããšãæããããšãã§ããŸããïŒ æ¬èšäºã§ã¯ããã®äžã®1ã€ã§ããã The Ruby One-Binary Tool, Enhanced with Kompo ãã§ç޹ä»ãããã Kompo ãã«ã€ããŠãå®éã«è©ŠããŠã¿ãçµæãšææã玹ä»ããŸãã Kompoãšã¯ 'Hello, world!'ãè¿ãã¹ã¯ãªãã kompo-vfs Kompo Rails æåŸã« Kompoãšã¯ Kompoãšã¯ãREADMEã§ãA tool to pack Ruby and Ruby scripts in one binary.ããšç޹ä»ãããŠããéããRubyã¹ã¯ãªããããã€ããªã«ããŠé
åžã§ããããŒã«ã§ãã Rubyã®ã¹ã¯ãªããããã€ããªã«ããããšã§ãé
åžã容æã«ãªã£ãããå®è¡ç°å¢ã«Rubyã®ã€ã³ã¹ããŒã«ãäžèŠã«ãªãããé
åžå
ã§ã®å®è¡ã容æã«ãªããŸãã Kompoã¯2024幎ã®RubyKaigiã§ãã It's about time to pack Ruby and Ruby scripts in one binary ãã®ã»ãã·ã§ã³ã§ç޹ä»ãããŠãããèå³ãæã£ãŠããŸããã 2024å¹Žã®æç¹ã§ã¯Railsãªã©ã®å€§ããªGemã¯å®è¡ã§ããŠããªããšã®ããšã ã£ãã®ã§ããã2025幎ã®çºè¡šã§ã¯RailsãåããŠããé²åãæããŸããïŒ 'Hello, world!'ãè¿ãã¹ã¯ãªãã ä»åã®ã»ãã·ã§ã³ã§Railsãåäœããããã«ãªã£ããšçºè¡šãããŠããã®ã§ãWebãµãŒããŒãåäœãããã€ããªãäœã£ãŠã¿ãããšã«ããŸããã ãšã¯ãããæåãã倧ããªãã®ãäœãããšãããšè©°ãŸãå¯èœæ§ãé«ãã§ããäœäºãã¹ã¢ãŒã«ã¹ã¿ãŒããè¯ãã§ããã å
¥éãšããã° 'Hello, world!'ãšããããšã§ããŸãã¯'Hello, world!'ãè¿åŽããRubyã¹ã¯ãªããã§ãã©ã€ããŸããã ãªããããããã®å
容ã¯å·çæç¹(2025幎4æ)ã®æ
å ±ãªã®ã§ææ°çã§ã¯å€æŽãããŠããå¯èœæ§ããããŸãã kompo-vfs Kompoã¯å
éšã§ä»®æ³ãã¡ã€ã«ã·ã¹ãã ã䜿ã£ãŠãããšã®ããšã§ãã åœåã¯æ¢åã®ã©ã€ãã©ãªã§å®çŸã§ããªããæ€èšãããšã®ããšã§ãããKompoã®ããããããšã«ããããããã®ããªãã£ããšã®ããšã§ã kompo-vfs ããèªäœããããã§ãã ãªããžããªãèŠãŠããã ããã°ããããŸããããã¡ãã¯Rustã§æžãããŠããŸããã Kompoã䜿ãã«ã¯ãŸãkompo-vfsãbuildããŠããå¿
èŠããããšã®ããšã§ãã READMEã«æ²¿ã£ãŠäœæ¥ããŸãã READMEã«ã¯æ¬¡ã®ããã«èšèŒãããŠããŸãã(â»æé ã¯Kompoã®READMEã«èšèŒãããŠããŸã) ## prerequisites Install [kompo-vfs](https://github.com/ahogappa/kompo-vfs). #### Homebrew $ brew tap ahogappa/kompo-vfs https://github.com/ahogappa/kompo-vfs.git $ brew install ahogappa/kompo-vfs/kompo-vfs ### Building To build komp-vfs, you need to have cargo installation. $ git clone https://github.com/ahogappa/kompo-vfs.git $ cd kompo-vfs $ cargo build --release Set environment variables. $ KOMPO_CLI=/path/to/kompo-vfs/target/release/kompo-cli $ LIB_KOMPO_DIR=/path/to/kompo-vfs/target/release MacBookã䜿ã£ãŠããã®ã§brewã®æé ã詊ããŸãããããŸããããªãã£ãã®ã§ããªããžããªãcloneããæ¹æ³ã§å®æœããŸããã mainãã©ã³ãã§è©ŠããŠã¿ãŸããããbuildããšã©ãŒã«ãªããŸããã % cargo build --release ... error: could not compile `kompo_storage` ( lib ) due to 2 previous errors; 1 warning emitted ãã¡ãè²ã
è§£æãããšãããMacBookã«ã¯å¯Ÿå¿ããŠãªãããã ãšããããŸããã ããã§Dockerãç«ã¡äžããŠãã®äžã§buildããããšã«ããŸããã Kompoã®å®è¡ãDockerã§å®æœããæ¹ãè¯ãããã ã£ãã®ã§ãRubyã€ã¡ãŒãžããäœæããŸããã # Dockerfile FROM ruby:3.4.3 # Install dependencies RUN apt-get update && apt-get install -y \ git \ build-essential \ libssl-dev \ zlib1g-dev \ libyaml-dev \ libgmp-dev \ libreadline-dev \ pkg-config \ autoconf \ bison \ curl \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* # Install latest Rust using rustup RUN curl --proto ' =https ' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y ENV PATH= "/root/.cargo/bin:${PATH}" # Set working directory WORKDIR /app # Copy project files COPY . /app/ # Install bundler and dependencies RUN gem install bundler && bundle install CMD [ " tail ", " -f ", " /dev/null " ] buildããŠbashã§ã³ã³ããã«å
¥ããæ¹ããŠbuildãããæåããŸããð % docker build -t hello-world . % docker run -it --rm -v .:/app hello-world bash root:/app# cd kompo-vfs/ root:/app/kompo-vfs# cargo build --release ... Finished `release` profile [ optimized ] target ( s ) in 5 .40s Kompo 次ã«'Hello, world!'ãè¿ãRubyã¹ã¯ãªãããäœæããŸãã # hello.rb p ' Hello, world! ' Kompoã¯gemãå
¬éãããŠããªãã®ã§ãªããžããªãcloneããŠããŒã«ã«ã§çæããŸãã è²ã
詊è¡é¯èª€ããã®ã¡ã«æ°ã¥ããã®ã§ãããç»å£ã¹ã©ã€ãã®26ããŒãžã«ãããškompo㯠feature/use_rtld_next ã®æ¹ãææ°ãšæãããã®ã§ãã¡ããå©çšããŸãã Dockerã³ã³ããå
ã§ gem build ã宿œããŠãç¡äº kompo-0.2.0.gem ãçæã§ããŸããã root:/app/kompo# gem build kompo.gemspec WARNING: licenses is empty, but is recommended. Use an license identifier from https://spdx.org/licenses or 'Nonstandard' for a nonstandard license, or set it to nil if you don't want to specify a license. WARNING: open-ended dependency on mini_portile2 (>= 0) is not recommended use a bounded requirement, such as "~> x.y" WARNING: open-ended dependency on async (>= 0) is not recommended use a bounded requirement, such as "~> x.y" WARNING: You have specified the uri: https://github.com/ahogappa0613/kompo for all of the following keys: homepage_uri changelog_uri source_code_uri Only the first one will be shown on rubygems.org WARNING: See https://guides.rubygems.org/specification-reference/ for help Successfully built RubyGem Name: kompo Version: 0.2.0 File: kompo-0.2.0.gem 次ã«ãKompoãã€ã³ã¹ããŒã«ããŸãã root:/app# gem install kompo/kompo-0.2.0.gem ... Successfully installed kompo-0.2.0 10 gems installed æã¯æ¥ãïŒããšã¯æ¢±å
(Kompo)ããã ãã§ãïŒå®è¡ã«ã¯æ°åãããã®ã§åŸ
ã¡ãŸãã root:/app# kompo --help Usage: kompo [options] -e, --entrypoint=VAL File path to use for entry point. (default: './main.rb') -g, --use-group=VAL Group name to use with 'bundle install'. (default: 'default') --[no-]gemfile Use gem in Gemfile. (default: automatically true if Gemfile is present) --local-kompo-fs-dir=VAL --verbose Verbose mode. --dest-dir=VAL Output directry path. (default: current dir) --bundle-cache=VAL Specify the directory created by 'bundle install --standalone'. --ruby-version=VAL Specify Ruby version. (default: current Ruby version) --rebuild --repack root:/app# kompo -e hello.rb --local-kompo-fs-dir=kompo-vfs ... /usr/bin/ld: /app/kompo-vfs/target/release/libkompo_fs.a(529179467e613863-dummy_fs.o):(.rodata.WD+0x0): multiple definition of `WD'; /tmp/ccNwyWlB.o:(.rodata+0x0): first defined here /usr/bin/ld: /app/kompo-vfs/target/release/libkompo_fs.a(529179467e613863-dummy_fs.o):(.rodata.PATHS_SIZE+0x0): multiple definition of `PATHS_SIZE'; /tmp/ccNwyWlB.o:(.rodata+0x28): first defined here /usr/bin/ld: /app/kompo-vfs/target/release/libkompo_fs.a(529179467e613863-dummy_fs.o):(.rodata.PATHS+0x0): multiple definition of `PATHS'; /tmp/ccNwyWlB.o:(.rodata+0x30): first defined here /usr/bin/ld: /app/kompo-vfs/target/release/libkompo_fs.a(529179467e613863-dummy_fs.o):(.rodata.FILES_SIZE+0x0): multiple definition of `FILES_SIZE'; /tmp/ccNwyWlB.o:(.rodata+0x192c8): first defined here /usr/bin/ld: /app/kompo-vfs/target/release/libkompo_fs.a(529179467e613863-dummy_fs.o):(.rodata.FILES+0x0): multiple definition of `FILES'; /tmp/ccNwyWlB.o:(.rodata+0x192d0): first defined here collect2: error: ld returned 1 exit status /usr/local/bundle/gems/kompo-0.2.0/lib/kompo.rb:193:in 'Kernel#system': Command failed with exit 1: gcc (RuntimeError) ãšã©ãŒãçºçããŸããã kompo-vfsã§ã WD ã PATHS ãªã©ã®å®çŸ©ãéè€ããŠããããã§ãã Rustãªããããããã®ã§é°å²æ°ã§ããã kompo-vfs/kompo_fs/dummy_fs.c ã®äžã§ WD ã PATHS ãå®çŸ©ãããŠããã®ã§æãããå®çŸ©ãã³ã¡ã³ãã¢ãŠãããŠåbuildããŠããçŽããŠã¿ãŸããã // kompo-vfs/kompo_fs/dummy_fs.c // const char FILES[] = {}; // const int FILES_SIZE = 0; // const char PATHS[] = {}; // const int PATHS_SIZE = 0; // const char WD[] = {47,119,111,114,107,115,112,97,99,101,115,47,114,117,98,121,95,112,97,99,107,97,103,101,114,47, 0}; const char START_FILE_PATH[] = { 46 , 47 , 109 , 97 , 105 , 110 , 46 , 114 , 98 , 0 }; å床Kompoãå®è¡ãä»åã¯æ£åžžçµäºãããã€ããª( app )ãçæãããŸããð root:/app# kompo -e hello.rb --local-kompo-fs-dir = kompo-vfs ... info: Finish kompo! root:/app# ls -l app -rwxr-xr-x 1 root root 76437456 Apr 24 02:15 app root:/app# ./app " Hello, world! " æåŸã«å®è¡ããŸãããã£ãããªã®ã§Rubyãå
¥ã£ãŠããªãç°å¢ã§å®è¡ããŸãã Dockerfileã¯ãã¡ãã䜿ããŸããã FROM ubuntu:latest # Set working directory WORKDIR /app # Copy project files COPY . /app/ CMD [ " tail ", " -f ", " /dev/null " ] ã³ã³ãããç«ã¡äžããŠããã€ããªãå®è¡ããŸãã Rubyãå
¥ã£ãŠããªãç°å¢ã§å®è¡ã§ããŸããð % docker build -t ubuntu-app . % docker run -it --rm -v .:/app ubuntu-app bash root@62df4e7aa257:/app# ./app " Hello, world! " Rails ç°¡åãªRubyã¹ã¯ãªããã§ã¯å®è¡ã§ããããšãããã£ãã®ã§ã次ã¯Railsã«ææŠã§ãïŒ ãã ãçµè«ã¯ãè²ã
詊è¡é¯èª€ãããã®ã®èµ·åã§ãããã§ãã... Kompoãããšããã§ãšã©ãŒã«ãªã£ãããKompoã¯ã§ãããèµ·åã§ããªãã£ããããã以äžã®è§£æã¯é£ããã®ã§ä»åã¯è«ŠããŸããð æåŸã« ä»åã¯ç°¡åãªRubyã¹ã¯ãªããããã§ããŸããã§ããããã¯ã³ãã€ããªã§é
åžããŠããã«å®è¡ã§ããããšã¯ãšãŠã䟿å©ã ãšæããŸãããä»åŸã®æŽãªãé²åã«æåŸ
ã§ãïŒïŒ 5/13ïŒç«ïŒã«ããAfter RubyKaigi 2025ãZOZOããã¡ã€ã³ãã£ããã¯ã·ããããšããŠããã¯ã·ãæ ªåŒäŒç€Ÿãæ ªåŒäŒç€ŸZOZOããã¡ã€ã³ãã£æ ªåŒäŒç€Ÿã®3瀟ã§RubyKaigi 2025ã®æ¯ãè¿ããè¡ããŸãã LTãããã«ãã£ã¹ã«ãã·ã§ã³ãªã©ã³ã³ãã³ãçãã ããããªã®ã§ãã²ãåå ãã ããïŒïŒ https://pixiv.connpass.com/event/352852/ pixiv.connpass.com ãŸãããã¡ã€ã³ãã£ã§ã¯ãããããæ°ãããã®ãåãå
¥ãã€ã€ãRubyãç©æ¥µçã«æŽ»çšããŠRubyãšãšãã«æé·ããŠãããã°ãšèããŠãããŸãã äžç·ã«åãã¡ã³ããŒãçµ¶è³åéäžãªã®ã§ãèå³ãããæ¹ã¯ãã²ãã¡ããã â herp.careers