Какими должны быть значения GOPATH и GOROOT?

Я пытаюсь установить doozer вот так

$ goinstall github.com/ha/doozer

Я получаю эти ошибки.

goinstall: os: go/build: package could not be found locally
goinstall: fmt: go/build: package could not be found locally
goinstall: io: go/build: package could not be found locally
goinstall: reflect: go/build: package could not be found locally
goinstall: math: go/build: package could not be found locally
goinstall: rand: go/build: package could not be found locally
goinstall: url: go/build: package could not be found locally
goinstall: net: go/build: package could not be found locally
goinstall: sync: go/build: package could not be found locally
goinstall: runtime: go/build: package could not be found locally
goinstall: strings: go/build: package could not be found locally
goinstall: sort: go/build: package could not be found locally
goinstall: strconv: go/build: package could not be found locally
goinstall: bytes: go/build: package could not be found locally
goinstall: log: go/build: package could not be found locally
goinstall: encoding/binary: go/build: package could not be found locally

25 ответов

Решение

GOPATH обсуждается в cmd/go документация:

GOPATH Переменная окружения перечисляет места для поиска кода Go. В Unix значение представляет собой строку, разделенную двоеточиями. В Windows значение представляет собой строку, разделенную точкой с запятой. На плане 9 значение представляет собой список.

GOPATH должен быть настроен на получение, сборку и установку пакетов вне стандартного дерева Go.

GOROOT обсуждается в инструкции по установке:

Двоичные дистрибутивы Go предполагают, что они будут установлены в /usr/local/go (или же c:\Go под Windows), но есть возможность установить инструменты Go в другое место. В этом случае вы должны установить GOROOT Переменная окружения, указывающая на каталог, в котором она была установлена.

Например, если вы установили Go в свой домашний каталог, вы должны добавить следующие команды в $HOME/.profile:

export GOROOT=$HOME/go
export PATH=$PATH:$GOROOT/bin

Замечания: GOROOT должен быть установлен только при установке в другое место.

(обновленная версия ответа Криса Банча.)

Вот моя простая установка:

directory for go related things: ~/programming/go
directory for go compiler/tools: ~/programming/go/go-1.4
directory for go software      : ~/programming/go/packages

GOROOT, GOPATH, PATH установлены следующим образом:

export GOROOT=/home/user/programming/go/go-1.4
export GOPATH=/home/user/programming/go/packages
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

Итак, вкратце:

GOROOT для компилятора / инструментов, которые идут от установки.
GOPATH предназначен для ваших собственных проектов go / сторонних библиотек (загружается с помощью "go get").

Первый забег go env,
Если вы видите, что переходы не установлены, вы можете установить их с помощью homebrew или через пакет и / или другими способами.
Если вы видите вывод, значит, ваш go установлен.
Он показывает вам все envs, которые установлены и не установлены.

Если вы видите пустой для GOROOT:

  1. бежать which go (На моем компьютере: /usr/local/go/bin/go)
  2. затем экспортировать, как это export GOROOT=/usr/local/go

Если вы видите пустой для GOPATH:

  1. Создайте любую директорию в любом месте на вашем компьютере для проектов go в моем случае: ~/GO_PROJECTS
  2. затем export GOPATH=~/GO_PROJECTS

GOPATH обсуждается здесь:

GOPATH Переменная среды

GOPATH может быть установлен как разделенный двоеточиями список путей, внутри которых можно найти код Go, объекты пакета и исполняемые файлы.

Установить GOPATH использовать goinstall для сборки и установки вашего собственного кода и внешних библиотек вне дерева Go (и во избежание написания Make-файлов).

А также GOROOT обсуждается здесь:

$GOROOT Корень дерева Го, часто $HOME/go, По умолчанию это родительский каталог каталога, в котором all.bash это запустить. Если вы решили не устанавливать $GOROOTВы должны запустить gomake вместо make или gmake при разработке программ Go с использованием обычных make-файлов.

Я прочитал go help gopath Документы и был все еще невероятно смущен, но нашел этот маленький самородок с другой страницы Go Doc:

Переменная среды GOPATH указывает местоположение вашей рабочей области. Вероятно, это единственная переменная среды, которую вам нужно установить при разработке кода Go.

http://golang.org/doc/code.html

Начиная с версии 1.8 (2 квартал 2017 г.), для GOPATH по умолчанию будет установлено значение $HOME/go.

Смотрите выпуск 17262 и комментарий Роба Пайка:

$HOME/go это будет.
Единственного лучшего ответа не существует, но он короткий и приятный, и выбрать его может только проблема, если $HOME/go уже существует, что будет рад только для экспертов, которые уже установили и поймут GOPATH,

Обычно вам не следует устанавливать явно. Команда определяет соответствующий GOROOT автоматически в зависимости от расположения в собственном каталоге.


по умолчанию $HOME/go. Вам нужно только установить его явно, если вы хотите поместить его в другое место.

содержит:

Если вы установите оба GOBIN а также GOMODCACHE, и не задавать, то само по себе не должно иметь никакого эффекта.


Кроме того, в устаревшем режиме (когда GO111MODULE=off также установлен), содержит:

  • Исходный код, используемый для сборки пакетов, хранится в дереве каталогов с корнем $GOPATH/src.
  • Небинарные файлы, установленные с помощью, расположены по адресу $GOPATH/pkg.
    • Установка небинарных пакетов больше не особенно полезна: goкоманда имеет кеш встроенных артефактов , который требуется с Go 1.12 даже в режиме.
    • Кэш сборки не находится внутри GOPATH. Его местоположение можно установить с помощью GOCACHE переменная окружения.

¹ Двоичные файлы также можно установить с помощью go get на Go 1.17 и ранее, но go installявляется предпочтительным с Go 1.16; см. https://golang.org/doc/go1.16.

GOPATH должен указывать не на установку Go, а скорее на ваше рабочее пространство (см. https://golang.org/doc/code.html). Всякий раз, когда вы устанавливаете какой-либо пакет с помощью go get или go install, он попадает в GOPATH. Вот почему он предупреждает вас, что вы совершенно определенно не хотите, чтобы случайные пакеты из Интернета были сброшены в вашу официальную установку.

Относительно GOROOT в частности, Go 1.9 автоматически установит путь установки.
Даже если у вас установлено несколько Go, вызов 1.9.x GOROOT в /path/to/go/1.9 (раньше, если не установлено, он принимал путь по умолчанию, такой как /usr/local/go или же c:\Go).

См. CL Go Review 53370:

go tool теперь будет использовать путь, с которого он был вызван, чтобы попытаться найти корень дерева установки Go.
Это означает, что если вся установка Go будет перенесена в новое место, go tool должен продолжать работать как обычно.

Это может быть отменено установкой GOROOT в окружающей среде, что должно быть сделано только в необычных обстоятельствах.
Обратите внимание, что это не влияет на результат runtime.GOROOT() функция, которая продолжит сообщать исходное место установки; это может быть исправлено в более поздних выпусках.

Конфигурации GOPATH и GOROOT амортизируются.

Вместо этого вы можете использовать модуль GO.

Например:

mkdir go_appcd go_appgo mod init go_app

В современном Go вам не нужно устанавливать GOPATH или же GOROOT. Фактически, если вы не занимаетесь чем-то очень специализированным, лучше всего отключить их в вашей системе.

Используйте модули Go . Установив Go , выберите каталог, в котором вы хотите работать. Потом:

      $ mkdir example
$ cd example
$ go mod init example.com

Обратите внимание, что имя модуля example.comпроизвольно; если вы продолжите работу на GitHub, это может быть что-то вроде github.com/your-username/project-name.

Последняя команда создаст файл; теперь вы можете получать зависимости с помощью go get:

      $ go get rsc.io/quote

Теперь ваш код использует эту зависимость:

      $ touch main.go

Поместите это в main.go:

      package main

import (
    "fmt"

    "rsc.io/quote"
)

func main() {
    fmt.Println(quote.Go())
}

И запустить с:

      $ go run .

По исходному вопросу теперь вы можете получить свою зависимость с помощью:

      $ go get github.com/ha/doozer

Теперь вы можете использовать doozerмодуль в вашем коде. И так далее. Вы также можете изучить файл в своем каталоге, чтобы увидеть перечисленные зависимости вместе с их версиями. Каждый модуль самодостаточен, со своими версиями зависимостей. Вы можете разместить два модуля рядом друг с другом, каждый со своим go.mod файл, указывающий на разные версии какой-либо зависимости - все это будет работать нормально из-за изоляции между модулями.

Для получения дополнительной информации начните с официального руководства здесь . В нескольких главах он проведет вас через шаги, показанные выше, а также напишет ваши собственные повторно используемые модули и пакеты и импортирует их из других модулей. Дополнительные интерактивные руководства доступны по адресу https://play-with-go.dev/.

Как уже упоминалось выше:

Переменная среды GOPATH указывает местоположение вашей рабочей области.

Для Windows это работало для меня (в окне Ms-dos):

set GOPATH=D:\my_folder_for_go_code\

Это создает переменную GOPATH, которую Ms-dos распознает при использовании следующим образом:

cd %GOPATH%

Множество ответов, но без содержания, например, роботы, которые копируют и вставляют то, что есть в их системе. Нет необходимости устанавливать в качестве переменной среды. Однако существует полезная необходимость установить переменную среды, и если она не установлена, по умолчанию используется ${HOME}/go/ папка.

Это PATHпеременная окружения, на которую вы должны обратить внимание, потому что эта переменная может изменить ваш. Нет ! Забывать .

Теперь, если вы переключитесь или перейдете на новый, ваши загруженные пакеты будут использовать по умолчанию $HOME/goпапка, и она перепутается с тем, что было у вас раньше. Это не хорошо.

Следовательно, именно здесь вам нужно определить, чтобы изолировать загруженные пакеты нового go version.

Таким образом, забудьте GOROOT. Думать больше о GOPATH.

Запустить go help environment у него есть документация для каждой переменной среды, которая может быть указана go env команда

Есть команда, которую вы можете использовать: go env GOPATH

Вот одно решение (для одного пользователя):

GOROOT=$HOME/.local # your go executable is in $GOROOT/bin
GOPATH=$HOME/.gopath
PATH=$GOROOT/bin:$GOPATH/bin:$PATH

go жалуется, если вы измените .gopath к .go.

Я бы хотел, чтобы они пошли с тем, как rust/cargo ребята сделали и просто собрали все в одном месте.

Начиная с 2020 и Go версии 1.13+, в Windows лучший способ обновить GOPATH - это просто ввести в командной строке:

setx GOPATH C:\mynewgopath

Вам не нужно явно указывать GOROOT (Современные версии Go могут решить это самостоятельно в зависимости от расположения исполняемого вами файла go).

Кроме того, при попытке работать с vgo:

go: modules disabled inside GOPATH/src by GO111MODULE=auto; see 'go help modules'

Удаление GOROOT, обновление моего GOPATH и export GO111MODULE="on" решил вопрос.

GOPATH смотрите здесь

GOPATH может быть установлен в виде списка путей, разделенных двоеточиями, внутри которых можно найти код Go, объекты пакетов и исполняемые файлы.

Настройте GOPATH на использование goinstall для сборки и установки собственного кода и внешних библиотек вне дерева Go (и во избежание написания файлов Makefile).

После установки Go lang, GOROOT является корневым каталогом установки.

Когда я разбил бинарный файл Go Lang в каталоге Windows C:\, мой GOROOT должен быть C:\go. Если установлено с помощью установщика Windows, это может быть C:\Program Files\go (или C:\Program Files (x86)\go, для 64-битных пакетов)

 GOROOT = C:\go

в то время как моя GOPATH - это местоположение исходного кода Go lang или рабочей области.

Если мой исходный код Go lang находится в C:\Users\\GO_Workspace, ваш GOPATH будет выглядеть так:

 GOPATH = C:\Users\<xyz>\GO_Workspace

Также есть случай, когда мы используем go, он компилирует все файлы go.

Допустим, у нас был один файл main.go, а затем мы изменили текущий файл на main_old.go, а затем добавили наш новый файл main.go. Затем, когда мы создадим наше приложение, все файлы go будут скомпилированы. Таким образом, эта ошибка может быть связана с ошибкой компиляции в некоторых других файлах go.

Для всех новичков они могли просто export GOPATH=$HOME/go если вы используете Ubuntu или делаете go help gopath за дополнительной информацией.

Я должен был добавить

export GOROOT=/usr/local/Cellar/go/1.10.1/libexec

в мой ~/.bash_profile на Mac OS X

В OSX я установил с Brew, вот настройка, которая работает для меня

GOPATH="$HOME/my_go_work_space" //make sure you have this folder created

GOROOT="/usr/local/Cellar/go/1.10/libexec"

Если вы используете дистрибутив, вы должны указать, где находятся включаемые файлы, например:

$ rpm -ql golang | grep include
/usr/lib/golang/include

(Это для Fedora 20)

Значения должны быть (MACOS):

GOROOT="/usr/local/go" --> all binaries file core go
GOPATH="/Applications/proyectos/go" --> the route to workspace (custom workspace)
Другие вопросы по тегам