LoginSignup
0
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2023-02-08

検証環境

  • 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 getgo 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さんが良い感じに修正するまでこれで乗り越えましょう。

具体例

<>内のものはパラメーターです。

  1. GitLabにアクセスします。
  2. サインインします。
  3. Create a projectを押します。
  4. Create a blank projectを押します。
  5. Project nameにPrivatePackageと入力します。
  6. Create projectを押します。
  7. Cloneを押します。
  8. Clone with HTTPSCopy URLを押します。
  9. キーチェーンアクセスアプリを開きます。
  10. 新規のキーチェーン項目を作成します。を押してキーチェーン項目の作成画面を開きます。
  11. キーチェーン項目名にペーストします。
  12. アカウント名にGitLabのユーザー名を入力します。
  13. GitLabに戻ってset up a Personal Access Tokenを押します。
  14. Token nameにimportTestと入力します。
  15. Select scopesapiを選択します。
  16. Create personal access tokenを押します。
  17. パーソナルアクセストークンをコピーします。
  18. キーチェーン項目の作成画面にてパスワードにペーストします。
  19. ターミナルアプリを開きます。
  20. % git config --global credential.helper osxkeychainを実行します。
  21. % git clone <キーチェーン項目名>を実行します。
  22. % cd privatepackageを実行します。
  23. % go mod init <キーチェーン項目名からプロトコルを抜いたもの>を実行します。
  24. % nano Structure.goを実行します。
  25. 以下をペーストします。
    package privatepackage
    
    type Structure struct {
            Value int
    }
    
  26. Control+Xキーを押します。
  27. Yキーを押します。
  28. Enterキーを押します。
  29. % git add --allを実行します。
  30. % git commit --message="Implemented Structure"を実行します。
  31. % git pushを実行します。
  32. % cd ..を実行します。
  33. % mkdir importerを実行します。
  34. % cd importerを実行します。
  35. % go mod init importerを実行します。
  36. % nano main.goを実行します。
  37. 以下をペーストします。
    package main
    
    import (
            "fmt"
    
            "<キーチェーン項目名からプロトコルを抜いたもの>"
    )
    
    func main() {
            structure := privatepackage.Structure{
                    Value: 1,
            }
    
            fmt.Print(structure.Value)
    }
    
  38. Control+Xキーを押します。
  39. Yキーを押します。
  40. Enterキーを押します。
  41. % GOPRIVATE=gitlab.com go get <キーチェーン項目名からプロトコルを抜いたもの>を実行します。
  42. % go run .を実行します。
  43. 1が出力され無事importされました。

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0