Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Goにおけるインナーソースモデル構築への道のり

Avatar for Masaaki Goshima Masaaki Goshima
March 13, 2026
390

 Goにおけるインナーソースモデル構築への道のり

Avatar for Masaaki Goshima

Masaaki Goshima

March 13, 2026

Transcript

  1. 自己紹介 • goccy ( ごっしー ) ◦ Twitter(新X): @goccy54 /

    GitHub: @goccy • Go リポジトリの総獲得 Star 数:10K+ ◦ 個人OSS: go-json / go-yaml / bigquery-emulator etc. ◦ 企業OSS: grpc-federation etc.
  2. Go に限定して評価する仕組みを考える 1. リポジトリの go.mod を調べて、依存ライブラリをすべて抽出する ◦ e.g.) go mod

    graph 2. 「依存されているライブラリ」の方が重要だと考えてスコアをつける ◦ e.g.) 依存階層の数をそのまま加点 3. 1, 2 を社内すべてのリポジトリに対して反復操作し、モジュールごとのスコアを出す ◦ golang.org/x/sys: A repository ( 10 ) + B repository ( 20 ) = 30 4. モジュールに対応するリポジトリを見つける ◦ golang.org/x/sys: https://cs.opensource.google/go/x/sys 5. リポジトリに対する PRがマージされた数 x スコアを貢献者に加算 6. 期間を区切り、その間にマージされた PR から開発者ごとのスコアを算出 7. スコアの高い貢献者を賞賛する
  3. goccy/go-modrank • Go モジュールごとにスコアを計算したり、ホストされている リポジトリを見つけてデータベースに保存するツール ◦ 前のページの 4 までを担当してくれるツール ◦

    DBのデフォルトは SQLite3 だが任意のものに入れ替え可能 • Mercari ではこれを活用して依存しているモジュールを ランキング形式にして一覧できるサービスがある
  4. やることは単純だが、意外と大変 • リポジトリスキャンは重い操作なので、 Org にある リポジトリが大量にある場合は考えることが多い ◦ 全部 Clone して調べる?

    ◦ Go とは関係のないリポジトリも Clone する? ◦ 並行処理する必要があるかも? ◦ 途中で処理が中断したらどうする? ◦ GitHub API の Rate Limit は大丈夫?
  5. リポジトリクローンの最適化 • GitHub APIによる事前フィルタリング ◦ クローン前に GitHub APIで、アーカイブ済みか go.modが存在するか を事前チェックし、不要なクローンをスキップ

    • GitHub Rate Limit 対策 ◦ 取得対象のリポジトリを 100件ずつチャンクに分割し、 GraphQL API でバッチリクエストを行う ◦ GraphQL の ネストが少ないため、 1 API のコストがとても軽く、 数千リポジトリあっても大丈夫
  6. レジューム処理 • リポジトリを解析するたびに、ステータスを DB に保存 ◦ HEAD Commit Hash ◦

    Archived Status ◦ go.mod の有無 • スキャン済み ( HEADコミットが同じ )リポジトリは スキップできるので、途中から再開できる
  7. モジュールのホストリポジトリの取得方法 • Go Module Proxy (proxy.golang.org) から取得 ◦ https://proxy.golang.org/{module-name}/@latest にアクセス

    ◦ Response の JSON にある Origin.URL から取得 • gopkg.in の命名規則から推定 ◦ gopkg.in/{owner}/{pkg}.vN => github.com/{owner}/{pkg} ◦ gopkg.in/{pkg}.vN => github.com/go-pkg/{pkg} • go-import meta タグ ◦ https://{module-name}?go-get=1 にアクセス ◦ HTMLの <meta name="go-import"> tag の content 属性からURLを抽出 • 上から順に調べて取得