Может ли кто-нибудь объяснить, почему GOPATH удобен и как его следует использовать в целом?

Я новичок в языке программирования Go, и каждый учебник начинается с установки GOPATH в текущую папку проекта.

Я что-то упустил? Действительно ли программист должен установить GOPATH вручную, когда он cd в свою новую папку проекта Go? Я прочитал несколько часто задаваемых вопросов о GOPATH, но до сих пор не мог обвести вокруг себя.

И почему существует GOROOT? Какова его цель?

Существуют ли какие-либо автоматические инструменты, которые определяют, является ли текущий каталог корневой папкой проекта Go (например, некоторым скрытым файлом) и автоматически изменяет GOPATH в этот каталог?

Спасибо, любой совет, действительно оцененный

пс. Например, я разрабатываю полностью непересекающиеся проекты Go A, B и C, если они живут в единой среде "рабочего пространства"? Наверное, нет, но что мне делать с GOPATH и GOROOT??

Ответ 1

Целью GOPATH является централизация всех пакетов в одном общем рабочем пространстве. Само по себе это не новая концепция (например, подумайте о Java Classpath), но использовать Go гораздо проще, так как не поддерживается поддержка версий пакетов.

Программист Go не должен устанавливать GOPATH вручную при входе в новую папку проекта. Каждая папка проекта должна быть пакетом сама по себе и находиться в GOPATH вместе с другими пакетами, поэтому GOPATH следует устанавливать только один раз. Учебники начинаются с установки GOPATH, чтобы изолировать рабочую область учебника от чего-либо еще (или просто предполагая, что пользователь еще не установил GOPATH).

GOROOT настроен на предоставление стандартных пакетов программисту Go, вам не нужно ничего с этим делать. GOROOT для GOROOT есть одно правило: никогда, никогда не трогай его. Не устанавливайте в нем ничего, не изменяйте стандартные пакеты и т.д.

Я не знаю инструмента для обнаружения проектов Go в текущем каталоге, но его создание не должно быть очень сложным.

Как вы справляетесь с различными проектами, зависит от вас. Путь Go состоит в том, чтобы поместить каждый проект как пакет в $GOPATH/src и делать все оттуда. Поскольку мне это не очень нравится, я определил GOPATH как $HOME/.go. Затем я помещаю каждый проект в отдельный каталог где-то еще (где-нибудь на моем компьютере) и $GOPATH/src ссылку на каталог проекта в мой каталог $GOPATH/src. Затем я могу использовать каждую команду Go toolchain (например, go build myproject), использовать проект в качестве пакета для другой и т.д.

Ответ 2

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

Это похожая, но другая стратегия для Elwinar symlnks. Я запускаю новый проект в пустой папке и создаю src. И я помещаю в папку этот скрипт под названием env.sh:

if [ 'type -p go' = "" ]; then
    export PATH=$PATH:/usr/local/go/bin
fi
export GOPATH=$PWD
export PATH=$PATH:$PWD/bin

Каждый раз, когда я начинаю работать, я использую

. env.sh

Обратите внимание на точку и пробел - они имеют значение.

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

И еще: если ваши зависимости используют переменные окружения для тестирования и т.д., Вы также можете поместить их в env.sh Например, у Горпа есть

export GORP_TEST_DSN=test/testuser/TestPasswd9
export GO_TEST_DSN=testuser:[email protected]/test

добавление

В самых последних версиях Go GOPATH является необязательным; если вы не установите его, по умолчанию используется $ HOME/go. Если вы установили его, а также хотите использовать функцию новых модулей, установите также GO111MODULES=on.

Ответ 3

Вам не нужно устанавливать GOPATH или GOROOT. GOPATH по умолчанию находится в вашем каталоге user/home.

Если GOPATH не задан, предполагается, что он равен $ HOME/go в системах Unix и% USERPROFILE%\go в Windows. Если вы хотите использовать пользовательское местоположение в качестве своего рабочего пространства, вы можете установить переменную среды GOPATH.


Go Модули

Кроме этого, теперь есть поддержка Go Modules (начиная с Go 1.11), поэтому вам больше не нужно использовать GOPATH. Тем не менее, это все еще экспериментальная особенность.

Например, вы можете перейти в любой каталог в вашей системе (кроме $ GOPATH), и вы можете инициализировать новый модуль Go там, и вы можете работать там. GOPATH не требуется.

Вам просто нужно сделать это один раз (находясь в каталоге):

go mod init

$ GOPATH: Go хранит эти файлы под ним:

  • Исходные файлы ($ GOPATH/src)
  • Файлы скомпилированных пакетов ($ GOPATH/pkg)
  • Запускаемые файлы ($ GOPATH/bin)

$ GOROOT: где находится исходный код Go, как в стандартной библиотеке Go.


Также, чтобы запустить любой исполняемый файл go install ed из любой точки вашей системы, вы можете добавить $GOPATH/bin в переменную окружения path следующим образом:

export PATH=$PATH:$(go env GOPATH)/bin

Больше информации, проверьте это.