- 前置き
- Before my PR(~bundler v2系)
- After my PR(bundler v4系~)
- go-gem-wrapperについて
- Go gemやgo-gem-wrapperのもっと詳しい技術的な話について
- 大変だった思い出
- 【余談1】PRマージ直後の様子
- 【余談2】どうでもいい気付き
前置き
bundler v4.0.0で bundle gem --ext=go でGoのnative extension gem(以下、Go gem)のスケルトンが作れるようになりました。*1
[
--ext=go の実装を僕が作ったので宣伝させてください。
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について
僕が作ったライブラリです。
主に下記の2つで構成されています
github.com/ruby-go-gem/go-gem-wrapper(Goのmodule)- GoからCRubyの関数を呼び出すためのbindingを提供している
- https://rubygems.org/gems/go_gem (Rubyのgem)
- native extensionのビルド時にGoをビルドするための処理を追加
go testやgo fmtなど、Goでよく使うコマンドをRubyから呼び出しやすくするためのrake taskを提供
bundle gem --ext=go した時に作られるスケルトンの中で github.com/ruby-go-gem/go-gem-wrapper やgo_gemが組み込まれています
- https://github.com/ruby/rubygems/blob/bundler-v4.0.0/bundler/lib/bundler/templates/newgem/ext/newgem/go.mod.tt#L5
- https://github.com/ruby/rubygems/blob/bundler-v4.0.0/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt#L50-L52
Go gemやgo-gem-wrapperのもっと詳しい技術的な話について
RubyKaigi 2025 で話したのでそちらの発表資料やアーカイブをご参照ください。
余談ですが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をレビューしてくれた人たちに本当に感謝です...
うおおおおおおお!!!!!!!!!(bundlerにgo gemのスケルトンを作る対応が入った)https://t.co/JprjvbPv2K
— sue445 (@sue445) 2025年11月19日
— sue445 (@sue445) 2025年11月19日
【余談2】どうでもいい気付き
Bundler v4にGo(5)対応が入るの紛らわしいなw いっそBundler v5合わせでもっと寝かせておくべきだったか