Работа с Workspace в Go: Полное руководство

Workspace (рабочее пространство) в Go — это мощный инструмент для управления несколькими модулями в одном проекте. Он появился в Go 1.18 и упрощает разработку, когда у вас есть взаимосвязанные модули.

1. Что такое Workspace и зачем он нужен?

Workspace позволяет:

  • Работать с несколькими модулями одновременно без необходимости публиковать их в GOPATH или go.mod replace.
  • Упрощать разработку в монолитных репозиториях (monorepo).
  • Управлять зависимостями между локальными модулями без replace в go.mod.

2. Создание Workspace

Шаг 1: Инициализация Workspace

go work init

Создается файл go.work в корне проекта.

Шаг 2: Добавление модулей в Workspace

go work use ./module1 ./module2

Теперь go.work выглядит так:

go 1.21

use (
    ./module1
    ./module2
)

3. Структура Workspace

Пример структуры проекта:

myproject/
├── go.work          # Workspace файл
├── module1/         # Первый модуль
│   ├── go.mod       # go.mod модуля 1
│   └── main.go
└── module2/         # Второй модуль
    ├── go.mod       # go.mod модуля 2
    └── utils.go

4. Основные команды для работы с Workspace

Команда Описание
go work init Создает go.work
go work use [dir] Добавляет модуль в Workspace
go work edit Редактирует go.work вручную
go work sync Синхронизирует зависимости

5. Пример: Разработка двух связанных модулей

Модуль 1 (module1/main.go)

package main

import (
    "fmt"
    "github.com/user/module2/utils"  // Локальный модуль
)

func main() {
    fmt.Println(utils.Add(1, 2)) // Используем функцию из module2
}

Модуль 2 (module2/utils.go)

package utils

func Add(a, b int) int {
    return a + b
}

Файл go.work

go 1.21

use (
    ./module1
    ./module2
)

Теперь module1 может использовать module2 без replace в go.mod!


6. Преимущества Workspace перед replace

Workspace replace в go.mod
Глобальная настройка для всех модулей Требует правки в каждом go.mod
Не нужно коммитить изменения в go.mod replace должен быть в go.mod
Удобен для монолитных репозиториев Подходит для временных изменений

7. Отключение Workspace

Если нужно временно отключить Workspace:

go env -w GOWORK=off

Вернуть обратно:

go env -w GOWORK=$(pwd)/go.work

8. Советы по работе с Workspace

  1. Не коммитьте go.work в общий репозиторий (если это не шаблон для команды).
  2. Используйте Workspace для локальной разработки, а go.mod — для продакшена.
  3. go work sync помогает при обновлении зависимостей.