本文へ
ハクソク

世界を動かす技術を、日本語で。

GoコードをGitHubに依存させるな

元記事: 原文(iain.rocks)

概要

  • Go言語 では、ライブラリのインポート先として GitリポジトリのURL を直接指定可能
  • これにより、 どこでバグ報告や管理ができるか が明確
  • しかし、 ホスティングサービス依存 という問題点が存在
  • 独自ドメイン の利用が推奨される理由と設定方法を解説
  • Nginx設定例 や HTMLメタタグ の実装例も紹介

Goコードのインポートパス設計とその課題

  • Go では、ライブラリのインポートパスに GitリポジトリのURL を指定することで、go getコマンドで自動取得可能
  • 例:import "github.com/thetrueares/boneclone"と書けば、 GitHub から直接コード取得
  • これにより、 バグ報告先や配布元 が明確化され、 中央集権的なパッケージ管理システム が不要
  • しかし、 リポジトリのURL=ホスティングサービス依存 というカップリング問題が発生
  • GitHubからGitLab などへ移行する場合、 全プロジェクトのインポートパス修正 が必要になる
  • 結果として、 複数サービス併用 や 運用コスト増大 などの実害発生

独自ドメインによる解決策

  • 独自ドメイン (例:go.iain.rocks、go.uber.org、go.mongodb.org)をインポートパスに利用することで、 ホスティングサービス非依存 を実現
  • 例:go.iain.rocks/bonecloneをインポートパスに指定し、 裏側でGitHubやGitLabへリダイレクト
  • サービス移行時も、 DNSやWebサーバの設定変更 のみで対応可能
  • 社内ライブラリや商用開発 では、 独自ドメイン運用 が強く推奨される

NginxとHTMLメタタグによる実装例

  • Nginx設定例

    • server_name go.iain.rocks;で独自ドメイン指定
    • location /ブロックで、go-get=1クエリが無い場合は GitHubへ301リダイレクト
    • go-get=1クエリがある場合は、 HTMLファイルを返却
    • SSL/TLSやHTTP→HTTPSリダイレクトも設定
  • index.html例

    • <meta name="go-import" ...>タグで、 Goツール用のリポジトリ情報 を指定
    • <meta name="go-source" ...>タグで、 ソース参照用URLパターン を指定
    <meta name="go-import" content="go.iain.rocks/boneclone git https://github.com/that-guy-iain/boneclone">
    <meta name="go-source" content="go.iain.rocks/boneclone https://github.com/that-guy-iain/boneclone https://github.com/that-guy-iain/boneclone/tree/master{/dir} https://github.com/that-guy-iain/boneclone/blob/master{/dir}/{file}#L{line}">
    
  • この設定により、Goツールは正しいリポジトリを自動認識 し、 人間のアクセスはGitHubへ誘導 できる

まとめ

  • Goプロジェクトのインポートパス設計 では、 ホスティングサービスへの依存回避 が重要
  • 独自ドメイン運用 により、将来的なサービス移行や運用コスト低減を実現
  • NginxとHTMLメタタグ を活用した具体的な実装方法の提示
  • 商用・社内開発 では、 独自ドメインの積極採用 が推奨される

提供: ハクソク · 要約更新:

AIによる日本語要約です。内容は原文とあわせてご確認ください。

Hacker Newsの議論を読む

Hackerたちの意見

GitHubはほぼ永遠だよね。カスタムドメインは、支払いを止めると消えちゃうけど、オープンソース開発者ならGitHubが消えるよりその可能性が高いかも。いつか、みんな依存関係をベンダリングすることに戻るんじゃないかな。

└

そもそも、なんで依存関係のベンダリングをやめたんだろう?

└

典型的なソフトウェア企業の場合、ドメインが消えたら、もうコードに興味がないってことだよね。

└

ソフトウェア開発の分野が完全に停滞しない限り、いつか別のホスティングサービスに移ると思う。GitHubもSourceForgeやTravis CI、MySpaceのようになるだろうしね。だから、私の個人ドメインはこれからも重要であり続けるよ(もう23年も持ってるし)。その時にはgitを使ってないかもしれないし、使ってるかもしれないけど、どうなるかは分からないね。

└

go mod vendor... 私にはうまくいってるよ。それに、Goのように強力な標準ライブラリと後方互換性を重視するエコシステムには合ってると思う。あと、ここも参考にしてみて:https://proxy.golang.org/

私の意見では、Goを使っている商業ソフトウェア開発チームは、内部ライブラリやパッケージの名前空間にカスタムドメインを使うべきだと思う。上の「go」を外してもいいくらい、他のスタックにも当てはまると思うよ。コードコメントでGitHubドメインのリンクを使うのも、長期的には問題が出てくるからね。移行が起こって、そのリンクがどこにも指さなくなるとかな。

└

記事とこのコメントが、これらのURLを置き換えにくいものとして扱ってるのが混乱する。単純に検索して置き換えればいいじゃん?おそらく、全てが「GitHub.com」を指してるだけで、他のコードはあまり関係ないから、これは特に簡単なケースだと思う。コメントなら、移行中に数時間古くなっても特に問題ないしね。

└

まあ、そうなんだけど、他の言語はこのミスを犯しにくいんだよね。Goプロジェクトが、異なるファイルを異なるフォルダに置くのが理にかなうサイズになると(Goのフォルダベースのモジュールシステムを考えると、数百行のコードでよく起こる)、ツールが促す最も簡単な方法は、ソースコードにGitHubのURL(または使ってるgitホスティングサイトのURL)を入れることなんだ。

└

TFAはGoのパッケージシステムの仕組みに特化してると思う。

└

そうだね、唯一の問題は、会社全体が完全に別のカスタムドメインに移行することを決めたときだよ。例えば、contoso.comからxtools.cnに移るとか(企業のVPNに接続してないと解決すらしないし)。それで、依存してるライブラリを持ってるフレンドリーなチームの半分が、ソースコードを更新する代わりに、自分たちのローカルの/etc/hostsや.gitconfig、.ssh/configをいじって移行を引き延ばすんだ(そう、彼らはCIマシンにその変更を加えるための特別なスクリプトも書いてるし;いや、そのスクリプトを自分のCIマシンで実行しようとすると、自分のシムが壊れるからね)。

URLを使うのは間違いだと思う。これはURNか他の形式のURIにぴったりだね。DNSをバックエンドに使うURNも考えられるけど(それはURLに似てるけど)、もっと抽象的で複数の解決者が可能なものと署名がある方がいいと思う。

└

あなたが話している唯一の有用な代替案は、コンテンツアドレス型のものだね。可変レジストリのルックアップに依存する「URN」は実際にはURLだよ(どちらもURIだから)。

Hacker Newsで議論の続きを見る