@xCASx из примера golang.org https://golang.org/doc/code.html
допустим указанная выше структура лежит под $GOPATH/src/github.com/user/mymain тогда импорт service в main.go будет следующим:
import (
"github.com/user/mymain/service"
)
Конечно же это сработает при условии, что имя пакета в myservice.go будет - service.
Смисл в том, что при такой структуре локальный путь к пакету дублирует remote url что дает возможность с легкостью применить go get на каждый из пакетов.
Есть возможность использовать относительные пути к пакетам не под gopath, но это считается bad practice.
$GOPATH
, имитируя таким образом go get, либо задавать $GOPATH
ссылающийся на директорию проекта, при этом проект теперь обязан находиться в директрии src
?https://{servername}/projects/{project_name}/repos/{repo_name}/browse/{folder_name}
Здесь {folder_name}
это наша папка service
. И что, мне структуру пакетов завязывать вот на эту жесть с browse и прочим хламом?go get
. Значит мне все эти завязки на репозитории не нужны и я могу просто использовать относительные пути?$GOPATH/src/your_folder
git clone
в $GOPATH/src/
+ go get
без аргументов в папке с main.go должно быть достаточно. Также для менеджмента зависимостями есть много сторонних библиотек которые работают по описанному тобой принципу с отдельным $GOPATH, например govendor.import (
"./service"
)
то есть лучше:"myfolder/service"
под гопаз$GOPATH/src/
.$GOPATH/src/
как-то странно. Он у меня и источник зависимостей и рабочий проект одновременно. А если этого не делать, то мне каждый репозиторий надо клонировать по два раза: в рабочую директорию и в $GOPATH/src/
. При этом надо не забывать последний поддерживать в актуальном состоянии.@xCASx
1 Допустим я только начинаю разработку и у меня еще нет репы.
Ты просто делаешь mkdir -p $GOPATH/src/github.com/xCASx/dummyproj
идешь туда и стартуешь новый проект
ча модулей на разных языках, преимущественно java. Если я это все склонирую, то мне даже тяжело представить что может произойти.
Есть vendor
и ты можешь использовать нормальный пакетный менеджер, я использую glide
Опять же, вести всю разработку в $GOPATH/src/ как-то странно.
Общепринятая практика, просто надо привыкнуть - погоды не делает.
Пускай $GOPATH/src/
и является твоей рабочей папкой...
Долбаться со sparse checkout не хотелось бы.
Тут такого нету - никто не клонит один проект в два места.
Если ты хочешь отказаться от $GOPATH/src
то тебе придётся клонить твой проект submodule'ом в vendor
и там его ещё и .gitignore'ить %)
Что будет ещё более костыльно и неприятно.
Если завтра кто-то захочет собрать у себя проект
Пускай используют пакетный менеджер
Здесь {folder_name} это наша папка service. И что, мне структуру пакетов завязывать вот на эту жесть с browse и прочим хламом?
У гита были alias'ы вроде как... а структура действительно вырвиглазная.
Если завтра проект переедет с битбакета на гитхаб, мне надо будет обновить все импорты?
Да. Но ты можешь заюзать православный find . | sed -i ''
...
Значит мне все эти завязки на репозитории не нужны и я могу просто использовать относительные пути?
Нужны так как в golang'e запрещён циклический импорт - ты не можешь в пакете А заимпортить пакет Б, а в пакете Б заимпортить пакет А.
Ребят, подскажите, как правильно в Го сделать словарь с мьютексами, что-то типо такого
mutexes = map[string]*sync.Mutex
mutexes[key].Lock()
defer mutexes[key].Unlock()
Есть поток ключей, который слушают горутины, и нужно чтобы одинаковые ключи обрабатывались только одной горутиной. Т.е. если пришло 2 одинаковых ключа подряд, их взяли две разные горутины, но вторая ждет мьютекса.
_
, игнорируются утилитой go
_test.go