Как фрагментировать рабочее пространство 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")
}
Другие вопросы по тегам