ローカルで開発中の 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
)
これをローカルのディレクトリを参照するように変更します。
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 でその変更が反映されるようになります。