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

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

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for Masaaki Goshima Masaaki Goshima
March 13, 2026
140

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

Avatar for Masaaki Goshima

Masaaki Goshima

March 13, 2026
Tweet

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を抽出 • 上から順に調べて取得