Может ли кто-нибудь объяснить, почему 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
Больше информации, проверьте это.