Введение

В рамках этой лабораторной работы мы изучим два различных подхода к управлению зависимостями в языке Go: использование переменной окружения GOPATH и современную систему Go Modules. Эти концепции являются фундаментальными для грамотной организации и эффективного управления проектами на Go.

Основные темы:

  • GOPATH
  • GOROOT
  • Модули Go (Go Modules)

Подготовка

На этом этапе мы подготовим рабочую среду, распаковав предоставленный архив с исходными файлами.

  1. Сначала откройте терминал и перейдите в директорию проекта, выполнив следующую команду:

    cd ~/project
  2. Распакуйте архив helloWorld.tar.gz в текущую директорию:

    tar -xzf helloWorld.tar.gz
  3. После завершения распаковки убедитесь, что папка helloWorld была успешно создана:

    ls helloWorld

Если архив распакован правильно, команда выведет содержимое директории helloWorld.

Основы работы с GOPATH

До появления версии Go 1.11 для хранения всего исходного кода использовалось специальное рабочее пространство, определяемое переменной GOPATH. В этом шаге мы разберем, как устроена эта структура.

  1. GOROOT — это директория, в которую установлен сам язык Go. Она содержит инструменты компиляции и пакеты стандартной библиотеки.
  2. 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 для нового проекта.

  1. Создайте новую директорию для проекта под названием testHello:

    cd ~/project
    mkdir testHello
  2. Перейдите в созданную директорию:

    cd testHello
  3. Инициализируйте модуль Go для этого проекта:

    go mod init testHello

    Вы должны увидеть следующее сообщение:

    go: creating new go.mod: module testHello
  4. Создайте новый файл testHello.go внутри папки testHello со следующим содержимым:

    touch testHello.go
    package main
    
    import "fmt"
    
    func main() {
        fmt.Println("hello, world")
    }

Теперь проект testHello инициализирован с использованием Go Modules, и в него добавлена простая программа.

Импорт локальных пакетов через модули

В этом шаге мы продемонстрируем, как импортировать и использовать другие модули в вашем проекте.

Пакет helloWorld в одноименной папке уже инициализирован как модуль. Аналогично, пакет test, который также использует модули, импортирует функцию Say из пакета helloWorld.

Давайте изучим структуру и запустим код:

  1. Сначала ознакомьтесь со структурой директорий helloWorld и test:

    helloWorld
    ├── go.mod
    └── helloWorld.go
    test
    ├── go.mod
    └── test.go
  2. Затем откройте файл 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.

  1. Создайте директорию remoteModule:

    cd ~/project
    mkdir remoteModule
    cd remoteModule
  2. Инициализируйте модуль Go:

    go mod init remoteModule
  3. Создайте файл remote.go в папке remoteModule со следующим содержимым:

    touch remote.go
    package main
    
    import (
        "github.com/labex-labs/golang-dev-code/chap02module"
    )
    
    func main() {
        chap02module.StringTobase64("miiy")
    }

    Эта программа импортирует пакет chap02module с GitHub и вызывает его функцию StringTobase64.

  4. Запустите файл 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 из удаленного модуля.

  1. Создайте папку remoteModule2:

    cd ~/project
    mkdir remoteModule2
    cd remoteModule2
  2. Инициализируйте модуль Go:

    go mod init remoteModule2
  3. Создайте файл remote2.go со следующим содержимым:

    touch remote2.go
    package main
    
    import (
        "github.com/labex-labs/golang-dev-code/chap02module"
    )
    
    func main() {
        chap02module.Hello()
    }
  4. Запустите программу:

    go get github.com/labex-labs/golang-dev-code/chap02module
    go run remote2.go

    Ожидаемый результат:

    hello
✨ Проверить решение и практиковаться

Резюме

В ходе этой лабораторной работы мы изучили:

  • Назначение и роль директорий GOPATH и GOROOT.
  • Основы использования Go Modules для управления зависимостями.
  • Процесс инициализации и настройки модулей в проекте.
  • Способы импорта и использования как локальных, так и удаленных пакетов Go.

Теперь вы владеете базовыми навыками использования Go Modules для организации структуры и управления зависимостями в ваших проектах на языке Go.