【Golang】GitHub上のprivateリポジトリをimportする

Go言語で書いたコードをprivateリポジトリに置いてて、そのコードを他のリポジトリから呼び出すためのメモです。

やりたいこと

GitHubのprivateリポジトリにGo言語で書いたライブラリを置いていました。

このライブラリのリポジトリを、publicに変えることなくprivateのままimportして使いたいのです。

単純にimportしようとしたらエラーになる

こんな感じでprivateリポジトリのライブラリをimportしようとしたら

package main

import (
	"github.com/<ユーザ名>/golang-lib"
)

...

こんなエラーが表示されてビルドに失敗しました。

$ go build ../src/main.go                                                                                                                                                                                                                                  [master] 
go: finding module for package github.com/<ユーザ名>/golang-lib
../src/main.go:7:2: cannot find module providing package github.com/<ユーザ名>/golang-lib: module github.com/<ユーザ名>/golang-lib: git ls-remote -q origin in /home/user/go/pkg/mod/cache/vcs/588e0f756a53aa1a73372233db9fe1a5389215117dfbe15996c0de76f955b419: exit status 128:
        fatal: could not read Username for 'https://github.com': terminal prompts disabled
Confirm the import path was entered correctly.
If this is a private repository, see https://golang.org/doc/faq#git_https for additional information.

解決方法

エラーメッセージの「privateリポジトリの場合はここを見な!」みたいなメッセージとともに表示されたURLを覗いてみます。

Frequently Asked Questions (FAQ) - The Go Programming Language
Go is an open source programming language that makes it easy to build simple, reliable, and efficient software.

ここでは解決方法として、

  1. ~/.netrcにGitHubのアカウント名とAPIのアクセストークンを書いて認証を突破する方法
  2. GitHubに登録してるsshの鍵を利用して認証を突破する方法

の2つが紹介されていました。

今回は後者の方法を試してみます。
なお、当然ながらこの方法の場合、事前にGitHubに鍵を登録しておく必要があります。

~/.gitconfigに以下の設定を追加します。

[url "ssh://git@github.com/"]
	insteadOf = https://github.com/

これで再度ビルドしてみます。

$ go build ../src/main.go
go: downloading github.com/<ユーザ名>/golang-lib v0.0.0-20201229201758-0ee219d61b2f
../src/main.go:7:2: github.com/<ユーザ名>/golang-lib@v0.0.0-20201229201758-0ee219d61b2f: verifying module: github.com/<ユーザ名>/golang-lib@v0.0.0-20201229201758-0ee219d61b2f: reading https://sum.golang.org/lookup/github.com/<ユーザ名>/golang-lib@v0.0.0-20201229201758-0ee219d61b2f: 410 Gone
        server response:
        not found: github.com/<ユーザ名>/golang-lib@v0.0.0-20201229201758-0ee219d61b2f: invalid version: git fetch -f origin refs/heads/*:refs/heads/* refs/tags/*:refs/tags/* in /tmp/gopath/pkg/mod/cache/vcs/588e0f756a53aa1a73372233db9fe1a5389215117dfbe15996c0de76f955b419: exit status 128:
                fatal: could not read Username for 'https://github.com': terminal prompts disabled

何やらさっきとは違うエラーが表示されてまたビルドがコケました。

エラーメッセージでいろいろと調べてみると、どうやらGo言語のバージョン1.3以降はGOPRIVATEという環境変数を設定する必要がありそうです。

なので、↓のような感じで、参照したいprivateリポジトリのパスを設定してやります。

export GOPRIVATE="github.com/<ユーザ名>/golang-lib"

これで無事にビルドが成功しました。

参考:

How to fix "invalid version" and "could not read Username" in "go get" of a private repository?
I want to use private repositories that are hosted at GitHub in another GoLang-project. What I did: I created a private access token at my GitHub account sett...

コメント