Введение
В рамках этой лабораторной работы мы изучим два различных подхода к управлению зависимостями в языке Go: использование переменной окружения GOPATH и современную систему Go Modules. Эти концепции являются фундаментальными для грамотной организации и эффективного управления проектами на Go.
Основные темы:
- GOPATH
- GOROOT
- Модули Go (Go Modules)
Подготовка
На этом этапе мы подготовим рабочую среду, распаковав предоставленный архив с исходными файлами.
Сначала откройте терминал и перейдите в директорию проекта, выполнив следующую команду:
cd ~/projectРаспакуйте архив
helloWorld.tar.gzв текущую директорию:tar -xzf helloWorld.tar.gzПосле завершения распаковки убедитесь, что папка
helloWorldбыла успешно создана:ls helloWorld
Если архив распакован правильно, команда выведет содержимое директории helloWorld.
Основы работы с GOPATH
До появления версии Go 1.11 для хранения всего исходного кода использовалось специальное рабочее пространство, определяемое переменной GOPATH. В этом шаге мы разберем, как устроена эта структура.
GOROOT— это директория, в которую установлен сам язык Go. Она содержит инструменты компиляции и пакеты стандартной библиотеки.GOPATH— это место, где хранится ваш собственный код и сторонние библиотеки. Она включает три основные поддиректории:- src: здесь располагаются исходные коды ваших проектов.
- bin: здесь хранятся скомпилированные исполняемые файлы.
- pkg: здесь находятся скомпилированные объектные файлы пакетов (не исполняемые).
Чтобы проверить текущие значения GOPATH и GOROOT, выполните следующие команды:
## Проверка пути GOPATH
go env | grep GOPATH
## Проверка пути GOROOT
go env | grep GOROOT
Эти команды отобразят пути, настроенные в вашей системе.
Инициализация модуля
Система Go Modules была представлена в Go 1.11 и стала стандартом по умолчанию начиная с версии 1.13. Она призвана решить две основные проблемы:
- Жесткая привязка к GOPATH: Раньше код обязательно должен был находиться внутри
GOPATH/src. С модулями вы можете размещать свои проекты в любой папке на компьютере. - Управление версиями: Модули позволяют фиксировать конкретные версии зависимостей, что упрощает работу с разными версиями одного и того же пакета в разных проектах.
Сейчас мы инициализируем модуль Go для нового проекта.
Создайте новую директорию для проекта под названием
testHello:cd ~/project mkdir testHelloПерейдите в созданную директорию:
cd testHelloИнициализируйте модуль Go для этого проекта:
go mod init testHelloВы должны увидеть следующее сообщение:
go: creating new go.mod: module testHelloСоздайте новый файл
testHello.goвнутри папкиtestHelloсо следующим содержимым:touch testHello.gopackage main import "fmt" func main() { fmt.Println("hello, world") }
Теперь проект testHello инициализирован с использованием Go Modules, и в него добавлена простая программа.
Импорт локальных пакетов через модули
В этом шаге мы продемонстрируем, как импортировать и использовать другие модули в вашем проекте.
Пакет helloWorld в одноименной папке уже инициализирован как модуль. Аналогично, пакет test, который также использует модули, импортирует функцию Say из пакета helloWorld.
Давайте изучим структуру и запустим код:
Сначала ознакомьтесь со структурой директорий
helloWorldиtest:helloWorld ├── go.mod └── helloWorld.go test ├── go.mod └── test.goЗатем откройте файл
test/go.mod. Вы увидите следующее содержимое:module test go 1.15 require "helloWorld" v0.0.1 replace "helloWorld" => "../helloWorld"
Директива replace указывает Go использовать локальный путь ../helloWorld вместо попытки загрузить пакет из внешнего репозитория. Директива require указывает, что пакет test зависит от версии v0.0.1 пакета helloWorld.
| Параметр | Описание |
|---|---|
| module | Определяет имя модуля |
| require | Указывает зависимости |
| replace | Заменяет зависимости (например, на локальные пути) |
| exclude | Исключает определенные зависимости |
Чтобы запустить файл test.go из пакета test:
cd ~/project/test
go run test.go
Результат выполнения должен быть:
hello, world
Импорт удаленных пакетов
В Go можно легко импортировать пакеты из удаленных репозиториев. Продемонстрируем это на примере пакета с GitHub.
Создайте директорию
remoteModule:cd ~/project mkdir remoteModule cd remoteModuleИнициализируйте модуль Go:
go mod init remoteModuleСоздайте файл
remote.goв папкеremoteModuleсо следующим содержимым:touch remote.gopackage main import ( "github.com/labex-labs/golang-dev-code/chap02module" ) func main() { chap02module.StringTobase64("miiy") }Эта программа импортирует пакет
chap02moduleс GitHub и вызывает его функциюStringTobase64.Запустите файл
remote.go, используя следующие команды:go get github.com/labex-labs/golang-dev-code/chap02module go run -v remote.goПримечание: Пользователи бесплатного тарифа не имеют доступа к интернету, поэтому данная команда может не выполниться. Перейдите на тариф Pro, чтобы получить доступ к внешним ресурсам.
Команда go get скачивает пакет chap02module из GitHub и помещает его в кэш модулей. После этого команда go run скомпилирует и запустит вашу программу.
Мини-тест
На этом этапе мы проверим полученные знания, создав новый файл, который использует функцию Hello из удаленного модуля.
Создайте папку
remoteModule2:cd ~/project mkdir remoteModule2 cd remoteModule2Инициализируйте модуль Go:
go mod init remoteModule2Создайте файл
remote2.goсо следующим содержимым:touch remote2.gopackage main import ( "github.com/labex-labs/golang-dev-code/chap02module" ) func main() { chap02module.Hello() }Запустите программу:
go get github.com/labex-labs/golang-dev-code/chap02module go run remote2.goОжидаемый результат:
hello
Резюме
В ходе этой лабораторной работы мы изучили:
- Назначение и роль директорий
GOPATHиGOROOT. - Основы использования Go Modules для управления зависимостями.
- Процесс инициализации и настройки модулей в проекте.
- Способы импорта и использования как локальных, так и удаленных пакетов Go.
Теперь вы владеете базовыми навыками использования Go Modules для организации структуры и управления зависимостями в ваших проектах на языке Go.



