もう迷わない!Go言語のワークスペースの基本と使い方を徹底解説

2025年4月16日水曜日

Go言語

Go言語のワークスペースって、なんだか難しそう? 

いやいや、そんなことないんです! 

Go 1.18から登場したワークスペース機能 (`go work`) は、複数のGoモジュールを同時に扱うときの、ちょっとしたイライラを解消してくれる頼もしい味方なんですよ。

この記事では、Go言語のワークスペースが一体何なのか、どうやって使うのか、どんな時に便利なのかを、初心者の方にも「なるほど!」と思っていただけるように、基本からじっくり解説していきます。

この記事でわかること

  • Go言語のワークスペースの役割がわかる
  • `go work` コマンドの基本的な使い方がマスターできる
  • 複数のGoモジュールを効率よく開発する方法が身につく
  • ワークスペースを使うメリットが理解できる

Go言語のワークスペースとは?開発効率を上げる仕組みを理解しよう

Go言語のワークスペースは、一言でいうと「複数のGoモジュール(プロジェクトの部品みたいなもの)をまとめて管理するための作業場所」です。

特に、Go 1.18から導入された `go work` コマンドを使ったワークスペース機能は、ローカル環境にある複数のモジュールを、まるで一つの大きなプロジェクトのように扱えるようにしてくれます。

たとえば、自分で作った共通ライブラリ(`common-lib`)と、そのライブラリを使うアプリケーション(`my-app`)を同時に開発したいとき、従来はちょっと面倒な設定が必要でした。ライブラリを修正するたびに、アプリケーション側で依存関係を更新したり…といった具合です。

でも、ワークスペースを使えば、`common-lib` と `my-app` を同じワークスペースに入れておくだけで、Goのコマンド(`go build` や `go run` など)が自動的にローカルの `common-lib` を見てくれるようになります。まるでプロジェクトの全体像を把握している司令塔がいるみたいですね!

昔ながらの `GOPATH` を使った管理方法もありますが、今は `go work` を使うのが主流で、ずっとシンプルで分かりやすいので、この記事では `go work` を中心に見ていきましょう。

Go言語 ワークスペース(`go work`)の基本的な使い方

それでは、実際に `go work` コマンドを使ってワークスペースを操作する方法を見ていきましょう。コマンド自体はとってもシンプルなので、すぐに覚えられますよ!

ワークスペースの作成 (`go work init`)

まずは、ワークスペースの「作業場」を作りましょう。これは `go work init` コマンドで行います。

作業したいプロジェクトのルートディレクトリ(一番上の階層)を作って、その中でコマンドを実行するのが一般的です。

例として、`myworkspace` というディレクトリを作って、その中で実行してみましょう。

# まずは作業用のディレクトリを作る
$ mkdir myworkspace
$ cd myworkspace

# ワークスペースを初期化!
$ go work init

# 中身を確認してみる
$ ls
go.work

コマンドを実行すると、`go.work` というファイルがポツンと作られます。この `go.work` ファイルが、ワークスペースの設定ファイルであり、ワークスペースの本体のようなものです。今はまだ空っぽの状態ですね。

最初にワークスペースに追加したいモジュールが決まっている場合は、引数で指定することもできます。

# すでに module-a と module-b がある場合
$ go work init ./module-a ./module-b

ワークスペースへのモジュールの追加 (`go work use`)

次に、管理したいGoモジュールをワークスペースに追加します。使うコマンドは `go work use` です。
ワークスペースのルートディレクトリ(`go.work` がある場所)で、追加したいモジュールのディレクトリパスを指定して実行します。

例えば、`myworkspace` の中に `greeting` というモジュールと `cmd/app` というモジュールがあるとします。(これらは事前に `go mod init` でモジュール化されている必要があります)

# greeting モジュールをワークスペースに追加
$ go work use ./greeting

# cmd/app モジュールも追加
$ go work use ./cmd/app

# go.work ファイルの中身を見てみよう
$ cat go.work
go 1.22.0

use (
        ./cmd/app
        ./greeting
)

実行すると、`go.work` ファイルに `use` ディレクティブ(指示みたいなもの)が追加され、指定したモジュールがリストアップされます。これで、Goのコマンドはこれらのモジュールをワークスペースの一部として認識してくれるようになります。

ワークスペース内のモジュール確認と編集 (`go work edit`, `go.work`ファイル)

ワークスペースにどのモジュールが含まれているかを確認したり、設定を変更したりする方法も見ておきましょう。

`go work edit` コマンドを使うと、`go.work` ファイルを編集できますが、実は `go.work` ファイルはただのテキストファイルなので、直接エディタで開いて編集するのが一番手っ取り早いかもしれません。

先ほどの `go.work` ファイルはこんな感じでしたね。

go 1.22.0

use (
        ./cmd/app
        ./greeting
)

もし、`greeting` モジュールの代わりに `farewell` モジュールを使いたくなったら、エディタで `greeting` を `farewell` に書き換えるだけです。

go 1.22.0

use (
        ./cmd/app
        ./farewell # ここを書き換えた
)

また、`go.work` ファイルには `replace` ディレクティブを書くこともできます。これは、特定のモジュールの依存関係を、ローカルにある別のモジュールや特定のバージョンに置き換える機能です。普段はあまり意識しなくても、`go work use` を使うと裏でいい感じにやってくれますが、知っておくと応用が効きます。

ワークスペースからのモジュールの除外

ワークスペースからモジュールを外したい場合も簡単です。
`go work edit -drop=モジュールパス` コマンドを使うか、`go.work` ファイルを直接編集して、該当する `use` ディレクティブの行を削除します。

例えば、`cmd/app` をワークスペースから外したい場合は、`go.work` をこう編集します。

go 1.22.0

use (
        ./farewell # cmd/app の行を削除した
)

一時的にビルド対象から外したい場合や、もう使わなくなったモジュールを整理したいときに便利です。

Go言語 ワークスペースの具体的な活用シナリオ:複数モジュール開発の実践

さて、基本的な使い方がわかったところで、ワークスペースが一番輝く場面、つまり複数のローカルモジュールを同時に開発するシナリオを見ていきましょう! これぞワークスペースの真骨頂です。

ディレクトリ構成例

ワークスペースを使うときの典型的なディレクトリ構成は、こんな感じです。

プロジェクトのルートディレクトリに `go.work` ファイルがあり、その下に各モジュールが配置されます。

myworkspace/
├── go.work         <-- ワークスペース設定ファイル
├── stringutil/     <-- 文字列操作の共通ライブラリモジュール
│   ├── go.mod
│   └── reverse.go
└── myapp/          <-- 上記ライブラリを使うアプリケーションモジュール
    ├── go.mod
    └── main.go

この構成が絶対というわけではありませんが、このようにルートに `go.work` を置き、関連するモジュールをサブディレクトリにまとめるのが一般的で分かりやすいでしょう。

複数モジュールを同時に編集・ビルドする手順

上の `myworkspace` を例に、`stringutil` ライブラリに新しい機能を追加し、それをすぐに `myapp` で使ってみる、という流れをやってみましょう。

1. ワークスペースの設定: まず、`myworkspace` ディレクトリで `go work init ./stringutil ./myapp` を実行するか、`go work init` 後に `go work use ./stringutil` と `go work use ./myapp` を実行して、`go.work` ファイルに両方のモジュールを登録します。

# myworkspace ディレクトリにて
$ go work use ./stringutil
$ go work use ./myapp

2. ライブラリの修正: `stringutil/reverse.go` を編集して、何か変更を加えます(例えば、新しい関数を追加したり、既存の関数を修正したり)。

3. アプリケーションから利用: `myapp/main.go` で、修正した `stringutil` の機能を使うようにコードを書きます。

4. ビルドまたは実行:ここがポイントです! `myapp` ディレクトリに移動して `go build` や `go run .` を実行すると… なんと、`stringutil` モジュールへの変更が即座に反映された状態で `myapp` がビルド・実行されます!

# myapp ディレクトリに移動して実行
$ cd myapp
$ go run .
# (stringutil の変更が反映された結果が表示される)

ワークスペースがない場合、`stringutil` の変更を `myapp` に反映させるには、`myapp/go.mod` に `replace` ディレクティブを手動で追加する必要がありましたが、ワークスペースを使えばその手間が一切不要になります。これは楽ちんですよね!

Go言語 ワークスペースを使うメリットと注意点

ここまで見てきたように、Go言語のワークスペースはとても便利ですが、改めてメリットと、使う上で少し気にしておくと良い点をまとめておきましょう。

【メリット】複数モジュール開発の劇的な効率化

なんといっても最大のメリットは、複数のローカルモジュールを扱う開発が劇的に楽になることです。

  • ローカルにある依存モジュールへの変更が、特別な設定なしに即座に他のモジュールに反映される。
  • 開発中に `go.mod` ファイルへ一時的な `replace` ディレクティブを書いたり消したりする手間がなくなる。
  • モノレポ(一つのリポジトリで複数のサービスやライブラリを管理するスタイル)での開発と相性が良い。
  • 各モジュールの `go.mod` は本来の依存関係だけを記述すればよくなり、見通しが良くなる。

一度この快適さを知ってしまうと、もう元には戻れないかもしれません!

注意点も少しだけ

  • `go.work` ファイルは、そのワークスペースでの開発をスムーズにするための設定ファイルです。他の開発者も同じ構成で開発することが多いので、基本的にはバージョン管理システム(Gitなど)に含めるのがおすすめです。
  • `go install` コマンドは、ワークスペースモードだとデフォルトでは動作が少し変わることがあります(通常はワークスペース内のモジュールをビルド対象とします)。意図しない挙動になる場合は、ドキュメントを確認してみてください。
  • ワークスペースはあくまでローカル開発環境のための仕組みです。他の人があなたの `go.work` ファイルを持っていない場合、そのワークスペース設定は適用されません。

【まとめ】Go言語 ワークスペースで快適な開発環境を手に入れよう!

今回は、Go言語のワークスペース機能、特に `go work` コマンドの使い方とそのメリットについて解説しました。

要点をまとめると…

  • ワークスペースは複数のGoモジュールをまとめて扱うための作業場所。
  • `go work init` で作成し、 `go work use` でモジュールを追加する。
  • `go.work` ファイルが設定ファイルの中心となる。
  • 複数モジュールを同時に開発・修正する際に、依存関係の解決が非常に楽になる!

Go言語での開発、特に複数のモジュールが絡んでくるプロジェクトでは、ワークスペースは間違いなく強力な味方になってくれます。最初は少し戸惑うかもしれませんが、基本的なコマンドは少ないので、ぜひ実際に手を動かして試してみてください。
きっと、あなたのGo言語開発がもっとスムーズで快適になるはずです!

もっと詳しく知りたくなった方は、Goの公式ドキュメント(英語ですが…)も覗いてみると、さらに深い知識が得られますよ。

さあ、`go work` を使って、快適なGo開発ライフを送りましょう!

【関連記事】 Go言語とは?特徴・できること・将来性

このブログを検索

  • ()

自己紹介

自分の写真
リモートワークでエンジニア兼Webディレクターとして活動しています。プログラミングやAIなど、日々の業務や学びの中で得た知識や気づきをわかりやすく発信し、これからITスキルを身につけたい人にも役立つ情報をお届けします。 note → https://note.com/yurufuri X → https://x.com/mnao111

QooQ