go.modのGoモジュールの依存関係をリポジトリの最新のコミットにポイントする方法は?


110

v1.11 Go以降、モジュールのサポートが追加されました。コマンド

go mod init <package name>
go build

パッケージの依存関係について見つかったすべてのバージョンを含むファイルを生成go.modgo.sumます。

モジュールにリリースがない場合は、そのモジュールの最新のコミットが使用されます。モジュールにリリースがある場合は、最新のものが依存関係として選択されます。

ただし、公開されたリリースにはまだ含まれていないが、そのリリース以降に行われたコミットからの機能が必要になる場合があります。go.modモジュールのリリースではなく、モジュールのリポジトリ内の特定のコミットを指すように設定するにはどうすればよいですか?

go.modで手作業でできるようです

module /my/module

require (
...
github.com/someone/some_module v0.0.0-20181121201909-af044c0995fe
...
)

v0.0.0最後に公開されたリリースタグに対応していない場所は20181121201909、コミットタイムスタンプでありaf044c0995fe、コミットハッシュになりますか?そのような情報を手で見つけて入力する必要がありますか、それとももっと良い方法がありますか?

回答:


169

必要なコミットハッシュで「goget」するだけです。

go get github.com/someone/some_module@af044c0995fe

'go get'は、依存関係ファイル(go.mod、go.sum)を正しく更新します。

詳細:https//github.com/golang/go/wiki/Modules#how-to-upgrade-and-downgrade-dependencies


4
不明なリビジョン」または「無効なバージョン」というエラーが発生した場合-PRのハッシュ(プルリクエスト)を指定していないことを確認してください。マージされたPRでさえ間違っている可能性があります。の下で/commitsはなく、の下のリポジトリでコミットハッシュを探し/pullsます。詳細については、こちらをご覧ください:golang / go#31191は、これらの種類のコミットを明示的に除外します。
NoamManos19年

1
OPは、それをgo.modファイルに追加する方法を尋ねますが、その方法はgo get
尋ね

2
@Nulikgo getは、go.modOPが要求した方法で更新/追加する正しい方法です。
デイブ

95

特定のコミットを取得するために使用することに関するEvertonからの回答に加えてgo get github.com/someone/some_module@af044c0995fe、次のようなブランチ名を使用することもできます。

  • go get github.com/someone/some_module@master
  • go get github.com/someone/some_module@dev_branch

これらの例は、対応するブランチで最新のコミットを取得します。

それでも、などの疑似バージョンgo.modとしてファイルに記録されますv0.0.0-20171006230638-a6e239ea1c69。(これは、標準のsemver順序に基づいて、すべてのバージョンにわたって単純な全順序を提供するのに役立ちます)。


10
疑似バージョンの説明に感謝します。replace依存関係の一時的なフォークを使用しようとしていましたが、コミットを指すようにその置換を行う方法が見つかりませんでした。バージョンタグを作成して、このように指定する必要replace github.com/original/somelib => github.com/fork/somelib v1.2.3がありました。これは、簡単にテストしたい場合は少し多すぎます。 replace github.com/original/somelib => github.com/fork/somelib@commithash動作し replace github.com/original/somelib => github.com/fork/somelib commithashません
ZhandosZhylkaidar19年

7

私はしばらくの間、それがすべての人にとってどのように機能するかについて頭を悩ませてきました、そして私はそれを実行することができません。私にとっては、マスターブランチにコミットする必要がありましたが、それを取得できたのは私だけでした。

go getが特定のブランチ、コミットID、またはタグを操作するには、以下のコマンドを実行してgoモジュールのフラグを有効にする必要があります。

go env -w GO111MODULE = on

この後、私たちはできるようになります

go get repo@branchname
go get repo@tag
go get repo@commithash

3

ローカルディレクトリへの依存関係を一時的に置き換える場合(たとえば、2つのモジュールを同時に処理する場合)replacego.modファイルの最後にステートメントを追加できます。

module example.com/mypkg

go 1.15

require (
  gitlab.com/someone/a_package v0.14.2
)

replace gitlab.com/someone/a_package => ../my_forks/a_package

2

また、go.modファイルのタグの代わりにlatestという単語を入力すると、モジュールの最新のタグに変更されます。

例えば:

module /my/module

require (
...
github.com/someone/some_module latest
...
)

となります

module /my/module

require (
...
github.com/someone/some_module v2.0.39
...
)

実行後 go mod tidy

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.