go get
というのは、go 言語のパッケージマネージャのようなものです。外部ライブラリを導入したい時には go get
を使って Github、Bitbucket といったリポジトリからライブラリをローカル環境にダウンロードしてきてくれます。
通常、go get
で指定されるリポジトリは Public な状態ですので、別段意識せずにそのままパスを指定して実行していますが、そのリポジトリが Private な環境の場合にどうするか、というのがこの記事でのお話です。
個人的に進めていて、(まだ)公開できないプロジェクトなどは、リポジトリを Private にして管理しています。Bitbucket が早くから Private リポジトリを無料で使えておりましたので、リポジトリは主に Bitbucket を使っています。ここでは Bitbucket の例を記載しますが、基本は Github も同じはずです。
前提としては以下の通りです。
- 対象となるリポジトリは
bitbucket.org/drtaka/myproj
で公開範囲は Private - 既に
git
プロトコルでアクセス可能な設定が行われている (SSH の鍵は設定済み)
上記の状態で、例えば clone
が問題なく実行できるものとします。
$ git clone git@bitbucket.org:drtaka/myproj.git
ちなみに、go get
のコマンドですが、これは裏側では普通に git
を使っておりますので、go get
の設定を触るのではなく、git
の設定で対応します。
まず、このリポジトリに対して何も考えずに go get
を行ってみます。
以下のように 403 エラーが返ると思います。Forbidden、「閲覧禁止」ですね。アクセス許可がないということです。
$ go get bitbucket.org/drtaka/myproj go: missing Mercurial command. See https://golang.org/s/gogetcmd package bitbucket.org/drtaka/myproj: https://api.bitbucket.org/2.0/repositories/drtaka/myproj?fields=scm: 403 Forbidden
さて、どう対処するかですが、ヒントが上記のエラーに隠されています。
403 エラーの出ている行を読むと、https
プロトコルでアクセスしています。
go get
を使った場合には、git
が https
プロトコルを使ってアクセスしているんですね。
既に SSH を使った git プロトコルではアクセスできている訳ですので、go get
を使った時にも git
プロトコルでアクセスするようにします。
(これは1つの解法です。環境によってはこれにより別の仕組みに影響が出るかもしれません。その場合には、https
プロトコルでアクセスするための設定を考える必要があります。)
git
の設定を変更します。
$ git config --global url."git@bitbucket.org:".insteadOf "https://bitbucket.org/"
Github の場合は、以下で大丈夫だと思います。
$ git config --global url."git@github.com:".insteadOf "https://github.com/"
上記のコマンドを発行すると git
の設定ファイル $HOME/.gitconfig
が変更されています。以下の設定が追加されているはずです。
[url "git@bitbucket.org:"] insteadOf = https://bitbucket.org/
では、改めて go get
してみます。
$ go get -v bitbucket.org/drtaka/myproj go: finding bitbucket.org/drtaka/myproj latest go: extracting bitbucket.org/drtaka/myproj v0.0.0-20190810080409-7a4acdc67b28
うまくいったようです。
$ ll $GOPATH/pkg/mod/bitbucket.org/drtaka total 0 dr-x------ 7 hoge staff 224 8 11 11:00 myproj@v0.0.0-20190810080409-7a4acdc67b28
ちなみに試している go のバージョンは、1.12.4 です。
$ go version go version go1.12.4 darwin/amd64
以上です。
【追記】2020/05/10
$ go version go version go1.13.8 darwin/amd64
上記環境にて、ここまでの設定だけでは Go Get できない状況(410 Gone エラー
)となっていましたので、続編書いています。
The Go gopher was designed by Renée French.