グローバルナビゲーションへ

本文へ

フッターへ

お役立ち情報Blog



【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

Replaces the content of a module at a specific version (or all versions) with another module version or with a local directory. Go tools will use the replacement path when resolving the dependency.

特定のバージョン(またはすべてのバージョン)のモジュールのコンテンツを、別のモジュールバージョン またはローカルディレクトリに置き換えます。 Goツールは、依存関係を解決するときに置換パスを使用します。replace

Syntax

replace module-path [module-version] => replacement-path [replacement-version]
module-path
  • 交換するモジュールのモジュールパス。
module-version
  • オプション。 置き換える特定のバージョン。
  • バージョン番号を省略すると、モジュールのすべてのバージョンが矢印の右側のコンテンツに置き換えられます。
replacement-path
  • Goが必要なモジュールを探すパス。
  • モジュールパス、または置換モジュールのローカルファイルシステム上のディレクトリへのパスにすることができます。
  • モジュールパスの場合は、replacement-version値を指定する必要があります。
  • ローカルパスの場合、replacement-version値を使用することはできません。
replacement-version
  • 交換用モジュールのバージョン。
  • 置換バージョンは、replacement-pathがモジュールパス(ローカルディレクトリではない)の場合にのみ指定できます。

実際に試してみる

例えば、 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

最新の情報をお届けします