Я уже довольно давно занимаюсь разработкой для платформы JVM. Когда-то это была Java, теперь это Kotlin. И здесь все кажется логичным - вот ваш Maven, Gradle или любое другое описание проекта с версионными зависимостями, когда вы делаете сборку - артефакт прямо здесь. Это дает вам ощущение рабочего пространства. Параллельно легко разрабатывать несколько проектов - все они изолированы друг от друга.

Но затем новый игрок входит в этот идеальный мир - Go.

$ GOROOT? $ GOPATH? Какого черта? Где зависимости проекта? Есть что-нибудь вроде версий? А где мои двоичные файлы ?!

Я считаю, что такой дизайн экосистемы имеет рациональную основу и аргументированность. Но исходя из моего (вероятно, не только моего) опыта, это похоже на полностью параллельную вселенную.

Чтобы справиться с этим, я первым делом воспроизвел ожидаемую структуру папок $ GOPATH в каталоге проекта - bin, src и pkg . Затем создайте правильный путь импорта внутри папки src - например, github.com/gimlet2/ ‹someproject› и оформьте там сам проект. После этих манипуляций обновите переменную окружения $ GOPATH, чтобы она указывала на каталог проекта. Что ж, слишком сложно.

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

Но все же это было далеко не идеально. Может быть, здесь вам пригодится виртуальная среда? Он широко используется в Python для решения подобной проблемы. И первое, что я нашел на Github, было goenv. Этот проект не находится в активной разработке, но выполняет свою работу.

Пользоваться им довольно просто:

  1. Установите go get github.com/crsmithdev/goenv
  2. проверить свой проект
  3. затем в папке проекта сделайте goenv init github.com/me/myproject
  4. активная виртуальная среда . goenv/activate

Круто, работает! Но сейчас проблема dep. Он проверяет, находится ли ваш проект внутри соответствующего $ GOPATH. И goenv создает виртуальный $ GOPATH в ~ / .goenv / ‹имени проекта›. Внутри этой папки он также создает папки и структуру папок bin, pkg и src, указанную вами с помощью команды goenv init. Практически те же шаги, что я делал раньше вручную. И он создает символическую ссылку на вашу фактическую папку проекта. Итак, я немного улучшил goenv до cd в эту виртуальную папку проекта при активации среды.

Теперь вы можете сразу dep ensure запустить или запустить редактор кода (лично я использую Visual Studio Code для разработки Go), работать с git и т. Д. Я представил это изменение как запрос на перенос исходного проекта. Но вы также можете установить его с моей вилки - go get github.com/gimlet2/goenv.

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