【Go初学】golangアプリ内でプライベートリポジトリを利用する際の410 Gone
概要
golangアプリ内でプライベートリポジトリを利用する際つまづいたので書きたい。
事前条件
プライベートリポジトリとそれを利用する2つのgolangアプリを用意する。
goバージョンは「go1.17.4 darwin/amd64」
▼プライベートリポジトリ
この例ではプライベートリポジトリの名前は「Go_T_Used_Private_Repo」でモジュール参照先は「github.com/ArtefactGitHub/Go_T_Used_Private_Repo」となる。
以下ファイル配置、main.go、go.modファイルで、GitHubへプッシュ済みの状態。
.
├── mylog
│ └── log.go
└── go.mod
// main.go
package mylog
import "fmt"
type MyLog struct{}
func (l *MyLog) Print(str string) {
fmt.Println(str)
}
// go.mod
module github.com/ArtefactGitHub/Go_T_Used_Private_Repo
go 1.17
こちらのmylogパッケージを参照側アプリから利用する想定。
▼参照側アプリ
上のプライベートリポジトリ「Go_T_Used_Private_Repo」を利用するgolangアプリ。以下ファイル配置、main.go、go.modファイルの状態。
.
├── go.mod
└── main.go
package main
import (
"fmt"
"github.com/ArtefactGitHub/Go_T_Used_Private_Repo/mylog"
)
func main() {
fmt.Printf("start\n")
l := mylog.MyLog{}
l.Print("hoge")
}
module main
go 1.17
go.modはimportするパッケージのrequireを書いていない状態。
実行
利用する側で「go mod tidy」を実行するとエラーになる。
$ go mod tidy
go: finding module for package github.com/ArtefactGitHub/Go_T_Used_Private_Repo/mylog
go: downloading github.com/ArtefactGitHub/Go_T_Used_Private_Repo v0.0.0-20220514010304-64929e41f25d
main imports
github.com/ArtefactGitHub/Go_T_Used_Private_Repo/mylog: github.com/ArtefactGitHub/Go_T_Used_Private_Repo@v0.0.0-20220514010304-64929e41f25d: verifying module: github.com/ArtefactGitHub/Go_T_Used_Private_Repo@v0.0.0-20220514010304-64929e41f25d: reading https://sum.golang.org/lookup/github.com/!artefact!git!hub/!go_!t_!used_!private_!repo@v0.0.0-20220514010304-64929e41f25d: 410 Gone
server response:
not found: github.com/ArtefactGitHub/Go_T_Used_Private_Repo@v0.0.0-20220514010304-64929e41f25d: invalid version: git ls-remote -q origin in /tmp/gopath/pkg/mod/cache/vcs/d3603b7e023f500f004f718c5436e0c7ac55af14caa872278d138802dc245e82: 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.
対応
GOPRIVATE環境変数を設定する。golang v1.13から追加された設定。
$ export GOPRIVATE=github.com/ArtefactGitHub/Go_T_Used_Private_Repo
「GOPRIVATE=<プライベートリポジトリ名>」で指定する。この例では「GOPRIVATE=github.com/ArtefactGitHub/Go_T_Used_Private_Repo」。
自分のアカウントで管理しているプライベートリポジトリ全てに適用する場合はアカウント名までの指定になり、「GOPRIVATE=github.com/ArtefactGitHub」となる。
ターミナル上でexportするだけだと再度ターミナル開いた時に適用されないため、ユーザーディレクトリ直下の.bashrcなどに残しておく場合はファイルを開いて追記しておき、「source」コマンドで現在のターミナルへも適用しておく。
export GOPRIVATE="github.com/ArtefactGitHub/Go_T_Used_Private_Repo"
$ source ~/.bashrc
適用後 go mod tidy を行うとプライベートリポジトリのパッケージが取得できる。
$ go mod tidy
go: finding module for package github.com/ArtefactGitHub/Go_T_Used_Private_Repo/mylog
go: downloading github.com/ArtefactGitHub/Go_T_Used_Private_Repo v0.0.0-20220514010304-64929e41f25d
go: found github.com/ArtefactGitHub/Go_T_Used_Private_Repo/mylog in github.com/ArtefactGitHub/Go_T_Used_Private_Repo v0.0.0-20220514010304-64929e41f25d
調べているとGitHubのPersonalアクセストークンやらGOPROXYやらsshやら色々あったが、GOPRIVATEだけで済んだ。
備考
ダウンロードしたパッケージは「$GOPATH/pkg/mod」や、「$HOME/go/pkg/mod」以下に入る。キャッシュされた状態が原因で上手くいかなかったり、また逆に上手くいってしまったりするため、キャッシュ削除する場合は上記ディレクトリから削除するか「go clean --modcache」を実行する。
あとがき
GOPRIVATE追加するだけで、ちょっとググれば出てくるのだが、GOPRIVATE環境変数の末尾に「/」を入れてしまい、エラーが出続けてハマった。アクセストークンを1文字漏れてコピペしてハマったこともあり、正確にコピペ出来るようになりたい。
この記事が気に入ったらサポートをしてみませんか?