独自のプロジェクトでプライベートGoモジュールを使用する方法
序章
Goのエコシステムの有益な側面の1つは、多数のモジュールがオープンソースであることです。 それらはオープンソースであるため、自由にアクセス、調査、使用、および学習することができます。 ただし、独自のビジネスロジックを社内に保持するなど、さまざまな理由でプライベートGoモジュールを作成する必要がある場合があります。
このチュートリアルでは、プライベートGoモジュールを公開し、プライベートモジュールにアクセスするための認証を設定し、プロジェクトでプライベートGoモジュールを使用します。
前提条件
- バージョン1.16以降をインストールしてください。 これを設定するには、オペレーティングシステムのGoチュートリアルをインストールする方法に従ってください。
- Goモジュールの配布方法チュートリアルにあるGoモジュールの配布についての理解。
- Gitの使用方法:リファレンスガイドに従って取得できるGitの知識。
- 名前の付いた空のプライベートGitHubリポジトリ
mysecret
公開されたプライベートモジュール用。 開始するには、GitHubのドキュメントに従ってリポジトリを作成します。 - リポジトリから読み取るためのアクセス権を持つGitHubパーソナルアクセストークン。 これを使用して、Goがプライベートリポジトリにアクセスできるようにします。
プライベートモジュールの配布
多くのプログラミング言語とは異なり、Goは中央パッケージサーバーではなくリポジトリからモジュールを配布します。 このアプローチの利点の1つは、プライベートモジュールの公開がパブリックモジュールの公開と非常に似ていることです。 完全に独立したプライベートパッケージサーバーを必要とする代わりに、Goプライベートモジュールはプライベートソースコードリポジトリを介して配布されます。 ほとんどのソースコードホスティングオプションはこれをすぐにサポートするため、追加のプライベートサーバーを設定する必要はありません。
プライベートモジュールを使用するには、プライベートGoモジュールにアクセスできる必要があります。 このセクションでは、チュートリアルの後半で別のGoプログラムからプライベートモジュールにアクセスするために使用できるプライベートモジュールを作成して公開します。
新しいプライベートGoモジュールを作成するには、まず、それが存在するプライベートGitHubリポジトリのクローンを作成します。 前提条件の一部として、という名前のプライベートな空のリポジトリを作成しました mysecret
GitHubアカウントで、これはプライベートモジュールに使用するアカウントです。 このリポジトリは、コンピュータのどこにでも複製できますが、多くの開発者はプロジェクト用のディレクトリを持っている傾向があります。 このチュートリアルでは、という名前のディレクトリを使用します projects
.
を作る projects
ディレクトリとそれに移動します:
- mkdir projects
- cd projects
から projects
ディレクトリ、実行 git clone
プライベートのクローンを作成するには mysecret
コンピュータへのリポジトリ:
- git clone [email protected]:your_github_username/mysecret.git
Gitはモジュールのクローンを作成したことを確認し、空のリポジトリのクローンを作成したことを警告する場合があります。 もしそうなら、これはあなたが心配する必要があるものではありません:
OutputCloning into 'mysecret'...
warning: You appear to have cloned an empty repository.
次に、 cd
新しいに入る mysecret
クローンを作成して使用するディレクトリ go mod init
、プライベートリポジトリの名前とともに、新しいGoモジュールを作成するには:
- cd mysecret
- go mod init github.com/your_github_username/mysecret
モジュールが作成されたので、別のプロジェクトから使用できる関数を追加します。 使用する nano
、またはお気に入りのテキストエディタを使用して、リポジトリと同じ名前のファイルを開きます。 mysecret.go
. 名前は重要ではなく、何でもかまいませんが、リポジトリと同じ名前を使用すると、新しいモジュールで作業するときに最初に調べるファイルを簡単に決定できます。
- nano mysecret.go
の中に mysecret.go
ファイル、リポジトリと同じ名前のパッケージに名前を付けてから、 SecretProcess
行を印刷する関数 Running the secret process!
呼び出されたとき:
package mysecret
import "fmt"
func SecretProcess() {
fmt.Println("Running the secret process!")
}
プライベートモジュールが作成されたので、他の人が使用できるようにプライベートリポジトリに公開します。 プライベートリポジトリでは最初にしかアクセスできないため、プライベートモジュールにアクセスできるユーザーを制御できます。 自分へのアクセスを制限することもできますが、友人や同僚へのアクセスを許可することもできます。
プライベートGoモジュールとパブリックGoモジュールはどちらもソースリポジトリであるため、プライベートGoモジュールの公開は、パブリックGoモジュールの公開と同じプロセスに従います。 新しいモジュールを公開するには、を使用して現在のディレクトリに変更をステージングします。 git add
コマンドを実行し、これらの変更をローカルリポジトリにコミットします。 git commit
指図:
- git add .
- git commit -m "Initial private module implementation"
最初のコミットが成功したというGitからの確認と、コミットに含まれるファイルの概要が表示されます。
Output[main (root-commit) bda059d] Initial private module implementation
2 files changed, 10 insertions(+)
create mode 100644 go.mod
create mode 100644 mysecret.go
残っているのは、変更をGitHubリポジトリに移動することだけです。 パブリックモジュールと同様に、 git push
コードを公開するコマンド:
- git push
次に、Gitは変更をプッシュし、プライベートリポジトリにアクセスできるすべての人が変更できるようにします。
git push origin main
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 404 bytes | 404.00 KiB/s, done.
Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
To github.com:your_github_username/mysecret.git
* [new branch] main -> main
パブリックGoモジュールと同様に、プライベートGoモジュールにバージョンを追加することもできます。 Goモジュールの配布方法チュートリアルの新しいモジュールバージョンの公開セクションには、これを行う方法に関する情報が含まれています。
このセクションでは、次のコマンドを使用して新しいモジュールを作成しました SecretProcess
機能し、あなたのプライベートに公開しました mysecret
GitHubリポジトリ、プライベートGoモジュールにします。 ただし、別のGoプログラムからこのモジュールにアクセスするには、モジュールにアクセスする方法を認識できるようにGoを構成する必要があります。
GotoAccessプライベートモジュールの構成
Goモジュールは通常、ソースコードリポジトリから配布されますが、Goチームはいくつかの中央Goモジュールサービスも実行して、元のリポジトリに何かが起こった場合にモジュールが存在し続けるようにします。 デフォルトでは、Goはこれらのサービスを使用するように構成されていますが、プライベートモジュールをダウンロードしようとすると、これらのモジュールにアクセスできないため、問題が発生する可能性があります。 一部のインポートパスがプライベートであり、中央のGoサービスを使用しようとしてはならないことをGoに伝えるには、 GOPRIVATE
環境変数。 The GOPRIVATE
環境変数は、インポートパスプレフィックスのコンマ区切りのリストであり、検出されると、Goツールは中央サービスを経由せずに直接それらにアクセスしようとします。 そのような例の1つは、作成したばかりのプライベートモジュールです。
プライベートモジュールを使用するには、Goにプライベートモジュールを設定して、プライベートと見なすパスを指示します。 GOPRIVATE
変数。 あなたがあなたを設定するときにあなたがすることができるいくつかの選択があります GOPRIVATE
変数値。 1つのオプションは設定することです GOPRIVATE
に github.com
. ただし、これはあなたが探しているものではないかもしれません。これは、でホストされているモジュールに中央サービスを使用しないようにGoに指示するためです。 github.com
、あなたのものではないものを含みます。
次のオプションは設定することです GOPRIVATE
自分のユーザーパスのみに github.com/your_github_username
. これにより、すべてのGitHubをプライベートと見なすという問題は解決しますが、ある時点で、作成したパブリックモジュールがあり、Goモジュールミラーを介してダウンロードしたい場合があります。 これを行うことは問題を引き起こさず、完全に合理的なオプションですが、さらに具体的にするオプションもあります。
最も具体的なオプションは設定です GOPRIVATE
次のように、モジュールのパスに正確に一致させます。 github.com/your_github_username/mysecret
. これにより、前のオプションの両方の問題が解決されますが、各プライベートリポジトリを追加する必要がある問題も発生します。 GOPRIVATE
ここに示すように、個別に:
GOPRIVATE=github.com/your_github_username/mysecret,github.com/your_github_username/othersecret
あなた自身のための最良の選択肢を選ぶことはあなたの状況で賛否両論を比較検討することの問題です。
現在、プライベートモジュールは1つしかないため、値には完全なリポジトリ名を使用します。 を設定するには GOPRIVATE=github.com/your_github_username/mysecret
現在のターミナルの環境変数で、exportコマンドを使用します。
- export GOPRIVATE=github.com/your_github_username/mysecret
設定されていることを再確認したい場合は、 env
と一緒にコマンド grep
を確認するには GOPRIVATE
名前:
- env | grep GOPRIVATE
OutputGOPRIVATE=github.com/your_github_username/mysecret
Goはモジュールがプライベートであることを認識していますが、モジュールを使用するにはまだ十分ではありません。 あなたがしようとすると go get
プライベートモジュールを別のモジュールに追加すると、次のようなエラーが表示される可能性があります。
- go get github.com/your_github_username/mysecret
Outputgo get: module github.com/your_github_username/mysecret: git ls-remote -q origin in /Users/your_github_username/go/pkg/mod/cache/vcs/2f8c...b9ea: 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.
このエラーメッセージは、Goがモジュールをダウンロードしようとしましたが、まだアクセスできない何かが発生したことを示しています。 モジュールのダウンロードにはGitが使用されているため、通常は資格情報の入力を求められます。 ただし、この場合、GoはGitを呼び出しており、プロンプトを表示することはできません。 この時点で、モジュールにアクセスするには、Gitがすぐに入力せずにクレデンシャルを取得する方法を提供する必要があります。
HTTPS用のプライベートモジュールクレデンシャルの提供
あなたに代わってログインする方法をGitに伝える1つの方法は、 .netrc
ファイル。 ユーザーのホームディレクトリにあり、 .netrc
ファイルには、さまざまなホスト名と、それらのホストのログイン資格情報が含まれています。 Gitを含む多くのツールで広く使用されています。
デフォルトでは、 go get
モジュールをダウンロードしようとすると、最初にHTTPSを使用しようとします。 ただし、前の例で示したように、ユーザー名とパスワードの入力を求めるプロンプトを表示することはできません。 Gitにクレデンシャルを与えるには、 .netrc
それが含まれています github.com
ホームディレクトリにあります。
を作成するには .netrc
Linux、MacOS、またはWindows Subsystem for Linux(WSL)のファイルを開き、 .netrc
ホームディレクトリ内のファイル(~/
)編集できるように:
- nano ~/.netrc
次に、ファイルに新しいエントリを作成します。 The machine
値は、資格情報を設定するホスト名である必要があります。 github.com
この場合。 The login
その場合、値はGitHubユーザー名になります。 最後に、 password
値は、作成したGitHubパーソナルアクセストークンである必要があります。
machine github.com
login your_github_username
password your_github_access_token
必要に応じて、エントリ全体をファイルの1行に配置することもできます。
machine github.com login your_github_username password your_github_access_token
注:ソースコードホスティングに Bitbucket を使用している場合は、次の2番目のエントリも追加する必要があります。 api.bitbucket.org
に加えて bitbucket.org
. 以前は、Bitbucketは複数のタイプのバージョン管理のホスティングを提供していたため、GoはAPIを使用して、ダウンロードを試みる前にリポジトリのタイプを確認していました。 これはもはや当てはまりませんが、APIチェックはまだ存在しています。 この問題が発生した場合、エラーメッセージの例は次のようになります。
go get bitbucket.org/your_github_username/mysecret: reading https://api.bitbucket.org/2.0/repositories/your_bitbucket_username/protocol?fields=scm: 403 Forbidden
server response: Access denied. You must have write or admin access.
あなたが見たら 403 Forbidden
プライベートモジュールをダウンロードしようとするとエラーが発生します。Goが接続しようとしているホスト名を再確認してください。 次のような別のホスト名を示している可能性があります api.bitbucket.org
、あなたがあなたに追加する必要があること .netrc
ファイル。
これで、プライベートモジュールのダウンロードにHTTPS認証を使用するように環境が設定されました。 GoとGitがモジュールをダウンロードしようとするデフォルトの方法はHTTPSですが、代わりにSSHを使用するようにGitに指示することもできます。 HTTPSの代わりにSSHを使用すると便利な場合があるため、プライベートモジュールのプッシュに使用したのと同じSSHキーを使用できます。 また、個人用アクセストークンを作成したくない場合は、 CI /CD環境をセットアップするときにデプロイキーを使用できます。
SSH用のプライベートモジュールクレデンシャルの提供
HTTPSの代わりにプライベートGoモジュールの認証方法としてSSHキーを使用するために、Gitはと呼ばれる構成オプションを提供します insteadOf
. The insteadOf
オプションを使用すると、を使用する代わりに https://github.com/
すべてのGitリクエストのリクエストURLとして、 ssh://[email protected]/
.
Linux、MacOS、およびWSLでは、この構成は .gitconfig
ファイル。 このファイルは、コミットの電子メールアドレスと名前も構成されているため、既にご存知かもしれません。 ファイルを編集するには、 nano
、またはお気に入りのテキストエディタを開き、 ~/.gitconfig
ホームディレクトリのファイル:
- nano ~/.gitconfig
ファイルを開いたら、ファイルを編集して、 url
のセクション ssh://[email protected]/
以下の例のように:
[user]
email = [email protected]
name = Sammy the Shark
[url "ssh://[email protected]/"]
insteadOf = https://github.com/
の順序 url
に関連するセクション user
セクションは関係ありません。また、ファイルに他に何もない場合でも心配する必要はありません。 url
追加したセクション。 の順序 email
と name
内部のフィールド user
セクションも関係ありません。
この新しいセクションは、使用するURLがで始まることをGitに通知します https://github.com/
接頭辞を次のように置き換える必要があります ssh://[email protected]/
代わりは。 GoはデフォルトでHTTPSを使用するため、これは go get
コマンド。 例としてプライベートモジュールを使用すると、これはGoが github.com/your_github_username/mysecret
パスをURLにインポートします https://github.com/your_github_username/mysecret
. GitがこのURLに遭遇すると、URLが https://github.com/
によって参照されるプレフィックス insteadOf
結果のURLを次のように変換します ssh://[email protected]/your_github_username/mysecret
.
これと同じパターンは、GitHub以外のドメインでも使用できます。 ssh://git@
URLはそのホストでも機能します。
このセクションでは、SSHを使用してGoモジュールをダウンロードするようにGitを構成しました。 .gitconfig
ファイルと追加 url
セクション。 プライベートモジュールの認証が設定されたので、Goプログラムで使用するためにアクセスできます。
プライベートモジュールの使用
前のセクションでは、HTTPS、SSH、またはその両方を介してプライベートGoモジュールにアクセスするようにGoを構成しました。 Goがプライベートモジュールにアクセスできるようになったので、過去に使用した可能性のある他のパブリックモジュールと同様に使用できます。 このセクションでは、プライベートモジュールを使用する新しいGoモジュールを作成します。
プロジェクトに使用するディレクトリ(次のような) projects
、という名前のディレクトリを作成します myproject
を使用した新しいプロジェクトの場合 mkdir
指図:
- mkdir myproject
ディレクトリが作成されたら、を使用してディレクトリに移動します cd
を使用して新しいGoモジュールを初期化します go mod init
プロジェクトが存在するリポジトリURLに基づくプロジェクトの場合(次のような) github.com/your_github_username/myproject
. プロジェクトを他のリポジトリにプッシュする予定がない場合、モジュール名は myproject
、またはその他の名前ですが、共有されているほとんどのモジュールで完全なURLが必要になるため、完全なURLを使用することをお勧めします。
- cd myproject
- go mod init github.com/your_github_username/myproject
Outputgo: creating new go.mod: module github.com/your_github_username/myproject
次に、を開いてプロジェクトの最初のコードファイルを作成します main.go
と nano
、またはお気に入りのテキストエディタ:
- nano main.go
ファイル内で、イニシャルを設定します main
プライベートモジュールを呼び出す関数:
package main
import "fmt"
func main() {
fmt.Println("My new project!")
}
今すぐプロジェクトを実行し、すべてが正しく設定されていることを確認するには、 go run
コマンドを実行し、それを提供します main.go
ファイル:
- go run main.go
OutputMy new project!
次に、を使用して新しいプロジェクトの依存関係としてプライベートモジュールを追加します go get
、パブリックモジュールの場合と同様です。
- go get github.com/your_github_username/mysecret
The go
次に、ツールはプライベートモジュールのコードをダウンロードし、最新のコミットハッシュとそのコミットの時刻に一致するバージョン文字列を使用して依存関係として追加します。
Outputgo: downloading github.com/your_github_username/mysecret v0.0.0-20210920195630-bda059d63fa2
go get: added github.com/your_github_username/mysecret v0.0.0-20210920195630-bda059d63fa2
最後に、 main.go
再度ファイルして更新し、プライベートモジュールの呼び出しを追加します SecretProcess
の機能 main
関数。 また、更新する必要があります import
追加するステートメント github.com/your_github_username/mysecret
インポートとしてのプライベートモジュール:
package main
import (
"fmt"
"github.com/your_github_username/mysecret"
)
func main() {
fmt.Println("My new project!")
mysecret.SecretProcess()
}
プライベートモジュールで実行されている最終的なプロジェクトを確認するには、 go run
を提供しながら再度コマンド main.go
パラメータとしてのファイル:
- go run main.go
が表示されます My new project!
元のコードからの行ですが、今度は Running the secret process!
インポートした行 mysecret
モジュールも:
OutputMy new project!
Running the secret process!
このセクションでは、 go init
以前に公開したプライベートモジュールにアクセスするための新しいGoモジュールを作成します。 モジュールを作成したら、次に使用します go get
パブリックGoモジュールの場合と同じようにプライベートモジュールをダウンロードします。 最後に、 go run
プライベートモジュールを使用してGoプログラムをコンパイルして実行します。
結論
このチュートリアルでは、プライベートGoモジュールを作成して公開しました。 また、プライベートGoモジュールにアクセスするためにHTTPS認証とSSH認証の両方を設定します。 最後に、新しいプロジェクトでプライベートモジュールを使用しました。
Goモジュールの詳細については、Goプロジェクトに一連のブログ投稿があり、Goツールがモジュールとどのように相互作用して理解するかを詳しく説明しています。 Goプロジェクトには、GoモジュールリファレンスにGoモジュールに関する非常に詳細で技術的なリファレンスもあります。
に加えて GOPRIVATE
環境変数。プライベートGoモジュールを操作するときに使用できる変数が増えます。 詳細については、Goモジュールリファレンスのプライベートモジュールセクションを参照してください。
あなたが探検することに興味があるなら .netrc
ファイルの詳細については、.netrcのGNU Webサイトに、使用可能なすべてのキーワードのリストが含まれています。 git-configドキュメントには、 insteadOf
使用した構成オプションは、使用可能な他のオプションに加えて機能します。
このチュートリアルは、 DigitalOcean How to Code inGoシリーズの一部でもあります。 このシリーズでは、Goの初めてのインストールから、言語自体の使用方法まで、Goに関する多くのトピックを取り上げています。