くりにっき

フルスタックキュアエンジニアです

Bundler v4.0.0でGo gemを作れるようにした

前置き

bundler v4.0.0で bundle gem --ext=go でGoのnative extension gem(以下、Go gem)のスケルトンが作れるようになりました。*1

blog.rubygems.org

[

--ext=go の実装を僕が作ったので宣伝させてください。

github.com

Before my PR(~bundler v2系)

bundle gem--ext はcとrustのみサポートされていました 。

Go gemを作る時は bundle gem <GEM_NAME> --ext=c でCのnative extensionのスケルトンを作った後で https://github.com/ruby-go-gem/go-gem-wrapper/tree/v0.10.0/_tools/patch_for_go_gem のようなスクリプトを実行してパッチをあてる必要がありました。

After my PR(bundler v4系~)

CやRustと同様に bundle gem <GEM_NAME> --ext=go でGo gemのスケルトンが作れるようになりました。やったね!

go-gem-wrapperについて

僕が作ったライブラリです。

github.com

主に下記の2つで構成されています

  • github.com/ruby-go-gem/go-gem-wrapper (Goのmodule)
    • GoからCRubyの関数を呼び出すためのbindingを提供している
  • https://rubygems.org/gems/go_gemRubyのgem)
    • native extensionのビルド時にGoをビルドするための処理を追加
    • go testgo fmt など、Goでよく使うコマンドをRubyから呼び出しやすくするためのrake taskを提供

bundle gem --ext=go した時に作られるスケルトンの中で github.com/ruby-go-gem/go-gem-wrapper やgo_gemが組み込まれています

Go gemやgo-gem-wrapperのもっと詳しい技術的な話について

RubyKaigi 2025 で話したのでそちらの発表資料やアーカイブをご参照ください。

speakerdeck.com

rubykaigi.org

inside.pixiv.blog

余談ですがRubyKaigiの時に喋ったPR *2 がマージされてbundlerに取り込まれたのでKaigi Effect *3 と言えます。

大変だった思い出

だいたいの苦労話はRubyKaigiで話してるので、今回はRubyKaigiで喋っていないbundlerのPRについて書きます

Windowsの時だけなぜか特定のテストがハングする

bundlerはGitHub ActionsのUbuntu, macOS, WindowsのRunnerでそれぞれCIを実行してるんですが、なぜかWindowsの時だけ特定のテストがハングするという現象があってハマりました。(未解決)

https://github.com/ruby/rubygems/pull/8183/commits/44fe3fedef6f8784dbb7e61d8a6cf869d6394d24

Windowsでのビルドが1時間くらいかかる(つらい)

寝る前にpushして、起きてからCIの結果を確認することが多かったです。

https://github.com/ruby/rubygems/actions/runs/19452908845/job/55661461150

【余談1】PRマージ直後の様子

なんやかんやでマージしてもらえるまで1年くらいかかったので喜びもひとしお。

トリアージしてくれたhsbtさんやPRをレビューしてくれた人たちに本当に感謝です...

【余談2】どうでもいい気付き

Bundler v4にGo(5)対応が入るの紛らわしいなw いっそBundler v5合わせでもっと寝かせておくべきだったか