Работа с Workspace в Go: Полное руководство
Workspace (рабочее пространство) в Go — это мощный инструмент для управления несколькими модулями в одном проекте. Он появился в Go 1.18 и упрощает разработку, когда у вас есть взаимосвязанные модули.
Categories:
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
- Не коммитьте
go.workв общий репозиторий (если это не шаблон для команды). - Используйте Workspace для локальной разработки, а
go.mod— для продакшена. go work syncпомогает при обновлении зависимостей.