検証環境
- macOS Monterey バージョン 12.4(21F79)
- git version 2.32.1 (Apple Git-133)
- go version 1.19.1 darwin/amd64
導入
macOSのキーチェーンアクセスに自作のプライベートリポジトリーのユーザー名やパスワードを登録し、Gitにhelper = osxkeychain
を設定してそれを読み込ませることで自動的にログインすると便利です。
これを使ってgo get
やgo build
ができたらどんなに良いかと思い、実行してみたら以下のようなエラーにぶち当たる人は多いでしょう。
% go build
go: git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/package@v3.0.3+incompatible: missing go.sum entry; to add it:
go mod download git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/package
go: git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/package@v3.0.3+incompatible: missing go.sum entry; to add it:
go mod download git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/package
% go mod download git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/package
go: unrecognized import path "git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/package": reading https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/package?go-get=1: 401 Unauthorized
# 末尾に.gitを付けてみても…
% go get git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/package.git
go: git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/package.git@v3.0.3+incompatible: parsing go.mod:
module declares its path as: git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/package
but was required as: git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/package.git
% go build
example.go:20:2: no required module provides package git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/package.git; to add it:
go get git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/package.git
僕も大変困りまして色んなサイトを放浪しました。
公式サイトに書いてある手法を使ってもダメでしたし、そもそもNETRCやGitを仲介するのでhelper = osxkeychain
を使えなかったり😢
そんな折遂にとびっきりの解決策を見つけました。
解決策
ずばり、最初からパッケージ名の末尾に.git
を付けるだけです。
モジュールモードならgo mod init
から、そうでないならディレクトリー名から全部です。
これで全て通ります。
どうやら標準パッケージとGitHub由来だけは.git
を付けなくても動くのですが、その他のサービスのプライベートリポジトリーは.git
が必要なようです。
よく使うものだけ特殊な処理をして変に一般性を欠くとはプログラマーとしてあるまじき行為ですが、Googleさんが良い感じに修正するまでこれで乗り越えましょう。
具体例
<>内のものはパラメーターです。
- GitLabにアクセスします。
- サインインします。
-
Create a project
を押します。 -
Create a blank project
を押します。 -
Project name
にPrivatePackageと入力します。 -
Create project
を押します。 -
Clone
を押します。 -
Clone with HTTPS
のCopy URL
を押します。 -
キーチェーンアクセス
アプリを開きます。 -
新規のキーチェーン項目を作成します。
を押してキーチェーン項目の作成画面を開きます。 -
キーチェーン項目名
にペーストします。 -
アカウント名
にGitLabのユーザー名を入力します。 - GitLabに戻って
set up a Personal Access Token
を押します。 -
Token name
にimportTestと入力します。 -
Select scopes
のapi
を選択します。 -
Create personal access token
を押します。 - パーソナルアクセストークンをコピーします。
- キーチェーン項目の作成画面にて
パスワード
にペーストします。 -
ターミナル
アプリを開きます。 -
% git config --global credential.helper osxkeychain
を実行します。 -
% git clone <キーチェーン項目名>
を実行します。 -
% cd privatepackage
を実行します。 -
% go mod init <キーチェーン項目名からプロトコルを抜いたもの>
を実行します。 -
% nano Structure.go
を実行します。 - 以下をペーストします。
package privatepackage type Structure struct { Value int }
- Control+Xキーを押します。
- Yキーを押します。
- Enterキーを押します。
-
% git add --all
を実行します。 -
% git commit --message="Implemented Structure"
を実行します。 -
% git push
を実行します。 -
% cd ..
を実行します。 -
% mkdir importer
を実行します。 -
% cd importer
を実行します。 -
% go mod init importer
を実行します。 -
% nano main.go
を実行します。 - 以下をペーストします。
package main import ( "fmt" "<キーチェーン項目名からプロトコルを抜いたもの>" ) func main() { structure := privatepackage.Structure{ Value: 1, } fmt.Print(structure.Value) }
- Control+Xキーを押します。
- Yキーを押します。
- Enterキーを押します。
-
% GOPRIVATE=gitlab.com go get <キーチェーン項目名からプロトコルを抜いたもの>
を実行します。 -
% go run .
を実行します。 -
1
が出力され無事importされました。
以上、ご拝読ありがとうございました。