如何分割Go工作空间



所以我在整个Go工作空间和我自己的个人代码组织中遇到了一个问题。因此,我理解如何将工作区设置为src, pkg和bin,在一个总体gocode文件夹下。

然而,这与我的工作流程并没有很好地集成。在我的代码文件夹中,我还有另外两个文件夹:Work和Personal。"工作"文件夹包含了我为工作所做的所有项目,而"个人"文件夹则包含了个人的业余项目或有趣的测试。在这两个文件夹中,我都有Go项目,以及JavaScript、python和HTML项目。我真的不想交叉工作和个人一起在同一个Go文件夹,因为我想cd到工作,看到我所有的项目(无论是参考或易于访问)和相同的个人。我不想在一个充满工作和个人Go代码冲突的文件夹之间切换,然后另一个工作文件夹与Javascript加载。

但是当我像我解释的那样组织我的项目时,我基本上破坏了整个GOPATH功能,这反过来又扰乱了导入语句等。那么,我是否可以继续组织我的项目,让Go认为它们都在一个中央Go/src文件夹中?我相信我可以用符号链接做一些事情,因为我在Mac o x上,但我不知道这是否有效。有开发者在自己的公司里解决了这个问题吗?谢谢!

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")
}

最新更新