helper = osxkeychainしながら自作のプライベートリポジトリーをGoで使う方法

## 検証環境
* macOS Monterey バージョン 12.4（21F79）
* git version 2.32.1 (Apple Git-133)
* go version 1.19.1 darwin/amd64

## 導入
[macOSのキーチェーンアクセスに自作のプライベートリポジトリーのユーザー名やパスワードを登録](https://support.apple.com/ja-jp/guide/keychain-access/kyca1120/mac)し、[Gitに`helper = osxkeychain`を設定してそれを読み込ませることで自動的にログインする](https://qiita.com/yurachika2020/items/4453fbf20b49fb93fcff)と便利です。
これを使って`go get`や`go build`ができたらどんなに良いかと思い、実行してみたら以下のようなエラーにぶち当たる人は多いでしょう。
```zsh
% 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

```
僕も大変困りまして色んなサイトを放浪しました。
[公式サイトに書いてある手法](https://go.dev/ref/mod#private-modules)を使ってもダメでしたし、そもそもNETRCやGitを仲介するので`helper = osxkeychain`を使えなかったり😢
そんな折遂にとびっきりの解決策を見つけました。

## 解決策
ずばり、最初からパッケージ名の末尾に`.git`を付けるだけです。
モジュールモードなら`go mod init`から、そうでないならディレクトリー名から全部です。
これで全て通ります。
どうやら標準パッケージとGitHub由来だけは`.git`を付けなくても動くのですが、その他のサービスのプライベートリポジトリーは`.git`が必要なようです。
よく使うものだけ特殊な処理をして変に一般性を欠くとはプログラマーとしてあるまじき行為ですが、Googleさんが良い感じに修正するまでこれで乗り越えましょう。

## 具体例
<>内のものはパラメーターです。

1. [GitLab](https://gitlab.com)にアクセスします。
1. サインインします。
1. `Create a project`を押します。
1. `Create a blank project`を押します。
1. `Project name`にPrivatePackageと入力します。
1. `Create project`を押します。
1. `Clone`を押します。
1. `Clone with HTTPS`の`Copy URL`を押します。
1. `キーチェーンアクセス`アプリを開きます。
1. `新規のキーチェーン項目を作成します。`を押してキーチェーン項目の作成画面を開きます。
1. `キーチェーン項目名`にペーストします。
1. `アカウント名`にGitLabのユーザー名を入力します。
1. GitLabに戻って`set up a Personal Access Token`を押します。
1. `Token name`にimportTestと入力します。
1. `Select scopes`の`api`を選択します。
1. `Create personal access token`を押します。
1. パーソナルアクセストークンをコピーします。
1. キーチェーン項目の作成画面にて`パスワード`にペーストします。
1. `ターミナル`アプリを開きます。
1. `% git config --global credential.helper osxkeychain`を実行します。
1. `% git clone <キーチェーン項目名>`を実行します。
1. `% cd privatepackage`を実行します。
1. `% go mod init <キーチェーン項目名からプロトコルを抜いたもの>`を実行します。
1. `% nano Structure.go`を実行します。
1. 以下をペーストします。
    ```Go
    package privatepackage
    
    type Structure struct {
            Value int
    }
    ```
1. Control+Xキーを押します。
1. Yキーを押します。
1. Enterキーを押します。
1. `% git add --all`を実行します。
1. `% git commit --message="Implemented Structure"`を実行します。
1. `% git push`を実行します。
1. `% cd ..`を実行します。
1. `% mkdir importer`を実行します。
1. `% cd importer`を実行します。
1. `% go mod init importer`を実行します。
1. `% nano main.go`を実行します。
1. 以下をペーストします。
    ```Go
    package main
    
    import (
            "fmt"
    
            "<キーチェーン項目名からプロトコルを抜いたもの>"
    )
    
    func main() {
            structure := privatepackage.Structure{
                    Value: 1,
            }
    
            fmt.Print(structure.Value)
    }
    ```
1. Control+Xキーを押します。
1. Yキーを押します。
1. Enterキーを押します。
1. `% GOPRIVATE=gitlab.com go get <キーチェーン項目名からプロトコルを抜いたもの>`を実行します。
1. `% go run .`を実行します。
1. `1`が出力され無事importされました。

## 
以上、ご拝読ありがとうございました。