Работа с 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
помогает при обновлении зависимостей.