如何分割Go工作区

时间:2016-06-24 18:18:59

标签: macos go symlink project-organization

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

但是,这与我的工作流程并没有很好的整合。在我的代码文件夹中,我还有另外两个文件夹:Work和Personal。工作当然是包含我正在为我的工作工作的所有项目的文件夹,而个人是用于个人项目或有趣的测试。在这两个文件夹中,我有Go项目,以及JavaScript,python和HTML项目。我真的不想在同一个Go文件夹中将Work和Personal交叉在一起,因为我想进入Work并查看我的所有项目(参考或易于访问)和Personal相同。我不想在一个填充了Work和Personal Go代码冲突的文件夹之间切换,然后在另一个带有Javascript加载的Work文件夹之间切换。

但是当我按照我的解释组织我的项目时,我基本上打破了整个GOPATH功能,这反过来又混淆了导入语句,等等。所以,无论如何,我可以继续组织我的项目,因为它们和技巧进入思考它们都在一个中央Go / src文件夹中?我相信我可以用符号链接做一些事情,因为我在Mac o x但我不知道这是否有效。任何开发者都在自己的公司解决这个问题?谢谢!

1 个答案:

答案 0 :(得分: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")
}