【Go】go.modのreplaceでローカルのモジュールを参照する
goで複数のモジュールを組み合わせて機能を実装する場合にgo.modでモジュールをimportして使うのですが、importしたモジュール側に実際にどんな値が渡されてきているのかを調べたい場合にモジュールにデバッグコードを追加してpushし、利用側で変更したモジュールを更新する必要があります。
1回で済めばいいのですがそういうわけにもいかずかなり手間がかかってしまいます。
また、自分で作ったモジュールであればpush可能ですが、そうでない場合も多いかと思います。
そこでgo.modのreplaceを使ってgithubからimportするのではなくローカルのモジュールをimportする方法をご紹介します。
go.mod replace
go.mod file referenceに説明があります
replace
特定のバージョン(またはすべてのバージョン)のモジュールのコンテンツを、別のモジュールバージョン またはローカルディレクトリに置き換えます。 Goツールは、依存関係を解決するときに置換パスを使用します。replace
Syntax
replace module-path [module-version] => replacement-path [replacement-version]
module-path |
|
---|---|
module-version |
|
replacement-path |
|
replacement-version |
|
実際に試してみる
例えば、 github.com/google/uuid を利用しているプログラムでローカルに落としてきたuuidを参照するようにしてみます。
元となるプログラムは以下です。
go.mod
module github.com/hogehoge/sample
go 1.17
require github.com/google/uuid v1.3.0
main.go
package main
import (
"fmt"
"github.com/google/uuid"
)
func main() {
fmt.Println(uuid.NewString())
}
実行結果
$ go run main.go
4ba1567b-60c5-4a24-a474-a77d5c2f345a
ローカルのuuidを参照するように変更する
ローカルの任意の場所にuuidをcloneしてきます。
$ git clone git@github.com:google/uuid.git
今回は go mod edit -replace コマンドでローカルモジュールを参照するように変更します。
$ go mod edit -replace github.com/google/uuid=../uuid
上記コマンドを実行するとgo.modが変更されます。
※手動で書き換えてもOKです
go mod edit のhelpは $ go help mod edit で確認できます。
module github.com/hogehoge/sample
go 1.17
require github.com/google/uuid v1.3.0
replace github.com/google/uuid => ../uuid
この状態でローカルのuuidが参照されるようになりました。試しに uuid.NewString() の出力を変更してみます。
変更ファイル uuid/version4.go
変更前
func NewString() string {
return Must(NewRandom()).String()
}
変更後
func NewString() string {
return "hoge-" + Must(NewRandom()).String() + "-moge"
}
実行結果
$ go run main.go
hoge-6b366bf2-8837-4d3e-8ba7-b645901ac458-moge
ローカル側のuuidが参照されていることがわかります。
これで手元でいろいろ試すことができます。
さいごに
いかがでしたでしょうか。replaceを使えば簡単にimportモジュールを変更できました。
replaceを使ったあとは元に戻すことを忘れないようにしましょう!
この記事を書いた人
- 創造性を最大限に発揮するとともに、インターネットに代表されるITを活用し、みんなの生活が便利で、豊かで、楽しいものになるようなサービスやコンテンツを考え、創り出し提供しています。
この執筆者の最新記事
関連記事
最新記事
FOLLOW US
最新の情報をお届けします
- facebookでフォロー
- Twitterでフォロー
- Feedlyでフォロー