Как настроить кастомный GOPATH?

Коллеги, помогите разобраться. Вопрос избитый, но решить по ссылкам в сети пока не получилось (https://go.dev/wiki/SettingGOPATH).

Пытаюсь настроить кастомный gopath, чтобы мои и импортируемые пакеты лежали отдельно от стандартных гошных.

ГО установлен здесь:

D:\Programm Files\Go

Мой ворскспейс здесь:

D:\Kirill_disk_D\GoWorkspace, тут три папки - bin, src, pkg

GOPATH такой:

D:\Kirill_disk_D\GoWorkspace;D:\Programm Files\Go

В каталоге D:\Kirill_disk_D\GoWorkspace\src лежит 2 пакета: customtext и test

D:\Kirill_disk_D\GoWorkspace\src\customtext\customtext.go:

package customtext

const (
    NameFrst = "Kirill",
    NameScnd = "Sasha"
)

D:\Kirill_disk_D\GoWorkspace\src\test\test.go:

package main

import (
    "customtext"
    "fmt"
)

func main() {
    fmt.Println("Привет", customtext.NameFrst)
}

По запуску test.go:

$ go run "d:\Kirill_disk_D\GoWorkspace\src\test\test.go"

Не видит нужной src из GOPATH и отвечает, что нужного пакета в GOPATH по умолчанию нет:

test.go:4:2: package customtext is not in std (D:\Programm Files\Go\src\customtext)

У меня стоит версия go1.23.0, винда 11.

По команде в cmd:

C:\Users\Kirill>go env -w GOPATH=d:\Kirill_disk_D\GoWorkspace

Отвечает, что на даст переопределить GOPATH:

warning: go env -w GOPATH=... does not override conflicting OS environment variable

Вопрос: как сделать так, чтобы Go видел пакеты из кастомного GOPATH? Что я делаю не так? Заранее спасибо!


Ответы (1 шт):

Автор решения: Pak Uula

GOPATH - это тяжелое наследие прошлого. Имея на руках go 1.23, пользоваться этой переменной просто грешно. Нужно сразу переходить на правильные рельсы - модули и воркспейсы.

Вокрспейс - это способ организации нескольких модулей Го в единой связке. При наличии воркспейса Го ищет исходники модулей не где-то там, а в зарегистрированных соседних каталогах воркспейса.

Вот как это можно сделать в вашем случае:

  1. создать папку workspace, инициализировать в ней воркспейс командой go work init
  2. создать папку workspace\customtext, создать в ней модуль командой go mod init customtext
  3. создать папку workspace\tests, создать в ней модуль командой go mod init tests
  4. Добавить созданные модули в вокрспейс командами go work use customtext и go work use tests

Вот как это может выглядеть:

PS D:\tmp\try-go> mkdir workspace

    Directory: D:\tmp\try-go

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----          09.09.2024     0:30                workspace

PS D:\tmp\try-go> cd .\workspace\
PS D:\tmp\try-go\workspace> go work init        
PS D:\tmp\try-go\workspace> mkdir customtext

    Directory: D:\tmp\try-go\workspace

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----          09.09.2024     0:30                customtext

PS D:\tmp\try-go\workspace> cd .\customtext\
PS D:\tmp\try-go\workspace\customtext> go mod init customtext
go: creating new go.mod: module customtext
PS D:\tmp\try-go\workspace\customtext> cd ..
PS D:\tmp\try-go\workspace> mkdir tests     

    Directory: D:\tmp\try-go\workspace

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----          09.09.2024     0:31                tests

PS D:\tmp\try-go\workspace> cd .\tests\
PS D:\tmp\try-go\workspace\tests> go mod init tests     
go: creating new go.mod: module tests
PS D:\tmp\try-go\workspace\tests> cd ..
PS D:\tmp\try-go\workspace> go work use .\customtext\
PS D:\tmp\try-go\workspace> go work use .\tests\

В папке workspace файл go.work содержит структуру воркспейса

go 1.21.5

use (
    ./customtext
    ./tests
)

После такой настройки файлы из tests будут успешно находить пакет customtext.

Полный пример здесь: https://github.com/pakuula/StackOverflow/tree/main/go/1593138/workspace

→ Ссылка