ローカルで開発中の moduleA を、同じくローカルで開発中の applicationA で使いたい場合、通常は一旦 moduleA をBitbucketにpushする必要があります。 これはgoのモジュール管理の仕組みが、リモートのGitリポジトリからモジュールを取得する作りになっているためです。

ですが、変更の都度pushしていては手間がかかります。 これを解決する手段として workspaceモードを使うか、 replace があります

以下のような構成でディレクトリが配置されているとします。

❯ pwd
~/work/go-example
❯ tree
.
├── applicationA <- moduleAを利用するアプリケーション
│  ├── go.mod
│  └── main.go
└── moduleA
   ├── go.mod
   └── hello.go

workspaceを使う場合

1.18でWorkspaceモードが導入されました。

~/work/go-example でワークスペースを開始します。

$ go work init applicationA moduleA
$ tree
.
├── go.work
├── applicationA
│  ├── go.mod
│  └── main.go
└── moduleA
   ├── go.mod
   └── hello.go

※go.workはコミットしない

go.work の中身

go 1.22.3
use (
	./applicationA
	./moduleA
)

これによって、moduleAの変更内容が即座にapplicationAで利用できるようになります。

go.mod replace を使う場合

1.18以前の手順。ディレクトリが点在していてworkspaceがうまく使えない場合もこれになるのかな

Go Modules Reference - The Go Programming Language に説明があります。

特定のモジュールを別のモジュールまたはローカルのディレクトリに置き換えることができます。

replace module-path [module-version] => replacement-path [replacement-version]

replace github.com/my-account/modulea => ../moduleA
require (
	github.com/my-account/modulea v0.0.0-20240513113427
)

利用例

applicationA/go.mod

module github.com/my-account/applicationa
go 1.22.3
require (
	github.com/my-account/modulea v0.0.0-20240513113427
)

これをローカルのディレクトリを参照するように変更します。

$ go mod edit -replace github.com/my-account/modulea=../moduleA
module github.com/my-account/applicationa
go 1.22.3
replace github.com/my-account/modulea => ../moduleA
require (
	github.com/my-account/modulea v0.0.0-20240513113427
)

これで moduleA をローカルで変更すると、applicationA でその変更が反映されるようになります。

package main
 
import (
	"github.com/my-account/modulea"
)
 
func main() {
	modulea.Hello("world")
}

参考