GOPATH и модули в Go

GolangGolangBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

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

Точки знания:

  • GOPATH
  • GOROOT
  • Go Modules

Подготовка

На этом шаге мы подготовим среду, распаковав предоставленный архив tar.

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

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

    tar -xzf helloWorld.tar.gz
  3. После распаковки файла проверьте, создалась ли папка helloWorld:

    ls helloWorld

Это выведет содержимое директории helloWorld, если она была успешно распакована.

Базовый модуль GOPATH

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

  1. GOROOT - это директория, где установлен Go, включая его инструменты и пакеты стандартной библиотеки.
  2. GOPATH - это место, где находится ваш личный код на Go, и он содержит три директории:
    • src: Хранит исходный код вашего проекта.
    • bin: Хранит скомпилированные исполняемые файлы.
    • pkg: Хранит скомпилированные пакеты, которые не являются исполняемыми.

Чтобы проверить текущие значения GOPATH и GOROOT, выполните следующие команды:

## Check the GOPATH directory
go env | grep GOPATH

## Check the GOROOT directory
go env | grep GOROOT

Эти команды отобразят пути к GOPATH и GOROOT на вашем компьютере.

Инициализация модуля

Go Modules, введенные в Go 1.11 и включенные по умолчанию в Go 1.13, призваны решить две основные проблемы:

  • Слишком сильная зависимость от GOPATH: До появления Go Modules код должен был храниться внутри директории GOPATH/src. С появлением Go Modules вы можете хранить свой код в любом месте на вашем компьютере.
  • Проблемы с версиями зависимостей: Go Modules позволяют проектам управлять и отслеживать зависимости с определенными версиями, что упрощает работу с несколькими версиями одного и того же пакета.

На этом шаге мы инициализируем Go Module для нового проекта.

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

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

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

    go mod init testHello

    Вывод должен быть таким:

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

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

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

Импорт других пакетов с использованием модулей

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

Пакет helloWorld в папке helloWorld был инициализирован с использованием Go Modules. Аналогично, пакет test, который также использует Go Modules, импортирует функцию 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 Modules в проекте.
  • Как импортировать и использовать локальные и удаленные пакеты на Go.

По завершении этого практического занятия вы должны чувствовать себя комфортно при использовании Go Modules для управления зависимостями в своих проектах на Go.