📦

パッケージとモジュール — Gemfileがgo.modになった時

Rubyのrequire/gemシステム vs Goのpackage/moduleシステム

Rubyで外部ライブラリを使うには:Gemfileにgem 'rails'を追加してbundle installを実行。

Goでは:go get github.com/gin-gonic/ginを実行するとgo.modに自動追加。

Gemfile vs go.mod

RubyのGemfileはgem名とバージョン制約を書く:gem 'rails', '~> 7.0'
Goのgo.modはモジュールパス(通常GitHub URL)とバージョンを書く:require github.com/gin-gonic/gin v1.9.1

最大の違い:RubyGemsという中央レジストリがありgem install railsで名前だけでインストール。Goは中央レジストリなしでGitHub URLがパッケージ識別子。

require vs import

Ruby: require 'json' — ファイル名またはgem名でロード。
Go: import "encoding/json" — パッケージパスでimport。使っていないimportがあるとコンパイルエラー。Rubyではrequireしても使わなくてもエラーにならない。

ディレクトリ = パッケージ

Rubyではファイル構造とモジュール/クラス構造が緩く連結(Railsのautoloadが処理)。Goではディレクトリ1つがパッケージ1つ。同じディレクトリの全.goファイルは同じpackage宣言を持たなければならない。

GOPATH → Go Modules

昔のGoはGOPATHという固定パスに全コードを置く必要があった。Rubyで言えば全プロジェクトを~/ruby_projects/内でのみ開発するようなもの。今はGo Modules(go.mod)のおかげでどこでも開発可能。Bundlerが解決した問題をGoは2019年にやっと解決した。

RubyからGoへ

1

Ruby: Gemfile + bundle install → Go: go.mod + go get

2

Ruby: require "json" → Go: import "encoding/json"(未使用時コンパイルエラー)

3

Ruby: RubyGems中央レジストリ → Go: GitHub URLがそのままパッケージ名

4

Ruby: ファイル/モジュール緩い連結(autoload)→ Go: ディレクトリ=パッケージ(1:1対応)

メリット

  • パッケージダウンロードが速い — ソースを直接取得するのでビルドがシンプル
  • 未使用importがコンパイルエラー — コードが常に綺麗に維持される

デメリット

  • GitHub URLベースなのでリポジトリ削除/移動で依存性が壊れる
  • プライベートリポジトリ依存性設定がRubyGemsに比べて面倒

ユースケース

RailsプロジェクトのGemfile依存性をGoプロジェクトのgo.modにマッピングする時