序章

Goのエコシステムの有益な側面の1つは、多数のモジュールがオープンソースであることです。 それらはオープンソースであるため、自由にアクセス、調査、使用、および学習することができます。 ただし、独自のビジネスロジックを社内に保持するなど、さまざまな理由でプライベートGoモジュールを作成する必要がある場合があります。

このチュートリアルでは、プライベートGoモジュールを公開し、プライベートモジュールにアクセスするための認証を設定し、プロジェクトでプライベートGoモジュールを使用します。

前提条件

プライベートモジュールの配布

多くのプログラミング言語とは異なり、Goは中央パッケージサーバーではなくリポジトリからモジュールを配布します。 このアプローチの利点の1つは、プライベートモジュールの公開がパブリックモジュールの公開と非常に似ていることです。 完全に独立したプライベートパッケージサーバーを必要とする代わりに、Goプライベートモジュールはプライベートソースコードリポジトリを介して配布されます。 ほとんどのソースコードホスティングオプションはこれをすぐにサポートするため、追加のプライベートサーバーを設定する必要はありません。

プライベートモジュールを使用するには、プライベートGoモジュールにアクセスできる必要があります。 このセクションでは、チュートリアルの後半で別のGoプログラムからプライベートモジュールにアクセスするために使用できるプライベートモジュールを作成して公開します。

新しいプライベートGoモジュールを作成するには、まず、それが存在するプライベートGitHubリポジトリのクローンを作成します。 前提条件の一部として、という名前のプライベートな空のリポジトリを作成しました mysecret GitHubアカウントで、これはプライベートモジュールに使用するアカウントです。 このリポジトリは、コンピュータのどこにでも複製できますが、多くの開発者はプロジェクト用のディレクトリを持っている傾向があります。 このチュートリアルでは、という名前のディレクトリを使用します projects.

を作る projects ディレクトリとそれに移動します:

  1. mkdir projects
  2. cd projects

から projects ディレクトリ、実行 git clone プライベートのクローンを作成するには mysecret コンピュータへのリポジトリ:

  1. git clone [email protected]:your_github_username/mysecret.git

Gitはモジュールのクローンを作成したことを確認し、空のリポジトリのクローンを作成したことを警告する場合があります。 もしそうなら、これはあなたが心配する必要があるものではありません:

Output
Cloning into 'mysecret'... warning: You appear to have cloned an empty repository.

次に、 cd 新しいに入る mysecret クローンを作成して使用するディレクトリ go mod init、プライベートリポジトリの名前とともに、新しいGoモジュールを作成するには:

  1. cd mysecret
  2. go mod init github.com/your_github_username/mysecret

モジュールが作成されたので、別のプロジェクトから使用できる関数を追加します。 使用する nano、またはお気に入りのテキストエディタを使用して、リポジトリと同じ名前のファイルを開きます。 mysecret.go. 名前は重要ではなく、何でもかまいませんが、リポジトリと同じ名前を使用すると、新しいモジュールで作業するときに最初に調べるファイルを簡単に決定できます。

  1. nano mysecret.go

の中に mysecret.go ファイル、リポジトリと同じ名前のパッケージに名前を付けてから、 SecretProcess 行を印刷する関数 Running the secret process! 呼び出されたとき:

projects / mysecret / mysecret.go
package mysecret

import "fmt"

func SecretProcess() {
	fmt.Println("Running the secret process!")
}

プライベートモジュールが作成されたので、他の人が使用できるようにプライベートリポジトリに公開します。 プライベートリポジトリでは最初にしかアクセスできないため、プライベートモジュールにアクセスできるユーザーを制御できます。 自分へのアクセスを制限することもできますが、友人や同僚へのアクセスを許可することもできます。

プライベートGoモジュールとパブリックGoモジュールはどちらもソースリポジトリであるため、プライベートGoモジュールの公開は、パブリックGoモジュールの公開と同じプロセスに従います。 新しいモジュールを公開するには、を使用して現在のディレクトリに変更をステージングします。 git add コマンドを実行し、これらの変更をローカルリポジトリにコミットします。 git commit 指図:

  1. git add .
  2. 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 コードを公開するコマンド:

  1. 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つのオプションは設定することです GOPRIVATEgithub.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コマンドを使用します。

  1. export GOPRIVATE=github.com/your_github_username/mysecret

設定されていることを再確認したい場合は、 env と一緒にコマンド grep を確認するには GOPRIVATE 名前:

  1. env | grep GOPRIVATE
Output
GOPRIVATE=github.com/your_github_username/mysecret

Goはモジュールがプライベートであることを認識していますが、モジュールを使用するにはまだ十分ではありません。 あなたがしようとすると go get プライベートモジュールを別のモジュールに追加すると、次のようなエラーが表示される可能性があります。

  1. go get github.com/your_github_username/mysecret
Output
go 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 ホームディレクトリ内のファイル(~/)編集できるように:

  1. nano ~/.netrc

次に、ファイルに新しいエントリを作成します。 The machine 値は、資格情報を設定するホスト名である必要があります。 github.com この場合。 The login その場合、値はGitHubユーザー名になります。 最後に、 password 値は、作成したGitHubパーソナルアクセストークンである必要があります。

〜/ .netrc
machine github.com
login your_github_username
password your_github_access_token

必要に応じて、エントリ全体をファイルの1行に配置することもできます。

〜/ .netrc
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 ホームディレクトリのファイル:

  1. nano ~/.gitconfig

ファイルを開いたら、ファイルを編集して、 url のセクション ssh://[email protected]/ 以下の例のように:

〜/ .gitconfig
[user]
	email = [email protected]
	name = Sammy the Shark
	
[url "ssh://[email protected]/"]
	insteadOf = https://github.com/

の順序 url に関連するセクション user セクションは関係ありません。また、ファイルに他に何もない場合でも心配する必要はありません。 url 追加したセクション。 の順序 emailname 内部のフィールド 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 指図:

  1. mkdir myproject

ディレクトリが作成されたら、を使用してディレクトリに移動します cd を使用して新しいGoモジュールを初期化します go mod init プロジェクトが存在するリポジトリURLに基づくプロジェクトの場合(次のような) github.com/your_github_username/myproject. プロジェクトを他のリポジトリにプッシュする予定がない場合、モジュール名は myproject、またはその他の名前ですが、共有されているほとんどのモジュールで完全なURLが必要になるため、完全なURLを使用することをお勧めします。

  1. cd myproject
  2. go mod init github.com/your_github_username/myproject
Output
go: creating new go.mod: module github.com/your_github_username/myproject

次に、を開いてプロジェクトの最初のコードファイルを作成します main.gonano、またはお気に入りのテキストエディタ:

  1. nano main.go

ファイル内で、イニシャルを設定します main プライベートモジュールを呼び出す関数:

projects / myproject / main.go
package main

import "fmt"

func main() {
	fmt.Println("My new project!")
}

今すぐプロジェクトを実行し、すべてが正しく設定されていることを確認するには、 go run コマンドを実行し、それを提供します main.go ファイル:

  1. go run main.go
Output
My new project!

次に、を使用して新しいプロジェクトの依存関係としてプライベートモジュールを追加します go get、パブリックモジュールの場合と同様です。

  1. go get github.com/your_github_username/mysecret

The go 次に、ツールはプライベートモジュールのコードをダウンロードし、最新のコミットハッシュとそのコミットの時刻に一致するバージョン文字列を使用して依存関係として追加します。

Output
go: 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 インポートとしてのプライベートモジュール:

projects / myproject / main.go
package main

import (
	"fmt"

	"github.com/your_github_username/mysecret"
)

func main() {
	fmt.Println("My new project!")
	mysecret.SecretProcess()
}

プライベートモジュールで実行されている最終的なプロジェクトを確認するには、 go run を提供しながら再度コマンド main.go パラメータとしてのファイル:

  1. go run main.go

が表示されます My new project! 元のコードからの行ですが、今度は Running the secret process! インポートした行 mysecret モジュールも:

Output
My 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 ファイルの詳細については、.netrcGNU Webサイトに、使用可能なすべてのキーワードのリストが含まれています。 git-configドキュメントには、 insteadOf 使用した構成オプションは、使用可能な他のオプションに加えて機能します。

このチュートリアルは、 DigitalOcean How to Code inGoシリーズの一部でもあります。 このシリーズでは、Goの初めてのインストールから、言語自体の使用方法まで、Goに関する多くのトピックを取り上げています。