Как фрагментировать рабочее пространство Go
Так что я столкнулся с проблемой со всем рабочим пространством Go и моей собственной организацией кода. Итак, я понимаю, как предполагается, что рабочее пространство должно быть настроено с помощью src, pkg и bin в одной всеобъемлющей папке gocode.
Тем не менее, это не очень хорошо интегрируется с моим рабочим процессом. В моей папке с кодом у меня есть две другие папки: рабочая и личная. Конечно, работа - это папка, в которой содержатся все проекты, над которыми я работаю для своей работы, а личные - для личных побочных проектов или веселого тестирования. В обеих папках у меня есть проекты Go, а также проекты JavaScript, python и HTML. Я на самом деле не хочу скрещивать Work и Personal вместе в одной папке Go, потому что я хотел бы перейти в Work и увидеть все свои проекты (для справки или для простоты доступа) и то же самое с Personal. Я не хочу переключаться между одной папкой, заполненной столкновением кода Work и Personal Go, а затем другой папкой Work с множеством Javascript.
Но когда я организовываю свои проекты, как я объяснил, я по существу нарушаю всю функциональность GOPATH, которая в свою очередь мешает операторам импорта и т. Д. Так что в любом случае я могу продолжать организовывать свои проекты такими, какие они есть, и обмануть себя? в центральной папке Go / src? Я полагаю, что мог бы что-то сделать с символическими ссылками, так как я на Mac ox, но я не знаю, работает ли это или нет. Любой разработчик решит эту проблему в собственной компании? Спасибо!
1 ответ
https://dmitri.shuralyov.com/blog/18
Этот блог перечисляет, как вы можете настроить несколько путей в ваш $GOPATH
переменная, чтобы позволить вам делать то, что вы хотите. Идея состоит в том, что у вас есть рабочее пространство по умолчанию (где все ваши go get
будут помещены пакеты), а затем любые дополнительные рабочие пространства, которые у вас есть, могут следовать за этим рабочим пространством по умолчанию в переменной среды (через двоеточие на основе Unix). Инструмент Go специально разработан для этого случая использования и будет проверять каждый путь в вашем $GOPATH
по порядку, для зависимостей, используя первую версию той зависимости, которую он находит.
Единственное, что вам нужно знать, если вы сделаете это, это то, что вы не можете использовать $GOPATH
как текущая строка пути (сначала нужно разделить ее). Некоторые пакеты Go могут не справиться с этой настройкой. Однако, если вам когда-нибудь понадобится найти файл по любому из путей в вашем $GOPATH
сами эта функция сделает так:
func FindInGoPath(filePath string) (string, error) {
pathList := strings.Split(os.ExpandEnv("${GOPATH}"), string(os.PathListSeparator))
if strings.TrimSpace(pathList) == "" {
return "", errors.New("$GOPATH environment variable is empty/not set")
}
for _, path := range pathList {
if !strings.HasSuffix(path, string(os.PathSeparator)) {
path += string(os.PathSeparator)
}
if _, err := os.Stat(path + filePath); err == nil {
return path + filePath, nil
}
}
return "", errors.New("file not found")
}