見出し画像

【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から追加された設定。

goコマンドは、デフォルトでgoproxy.ioのパブリックGoモジュールミラーからモジュールをダウンロードします。また、デフォルトでは、ソースに関係なく、sum.golang.orgにあるパブリックGoチェックサムデータベースに対してダウンロードされたモジュールを検証します。これらのデフォルトは、公開されているソースコードでうまく機能します。

GOPRIVATE 環境変数は、go コマンドがどのモジュールをプライベート(一般に利用できない)とみなし、したがってプロキシやチェックサムデータベースを使用しないようにするかを制御します。この変数は、モジュールのパスの接頭辞のグロブパターン(Go の path.Match の構文)のカンマ区切りのリストです。

[GOPROXY.IO] GOPRIVATE環境
$ 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文字漏れてコピペしてハマったこともあり、正確にコピペ出来るようになりたい。

この記事が気に入ったらサポートをしてみませんか?