如何管理多个项目目录的GOPATH

7

作为一个有 Java 和 Grails 背景的人(30 年前曾经写过数百万行的 C 代码),我无法理解 Go 在 Windows 上需要使用固定的 GOPATH 路径,还能否可用。

安装 Go 后会创建以下目录结构:

c:\users\me\go\scr
              \pkg
              \bin

由于您希望拥有许多Go项目,因此它们似乎必须混合在同一src/kpg/bin目录中,相互污染。例如:

/src/project1/hello.go
    /project2/hello.go
/pkg/xx
/bin/hello.exe

hello.exe将运行哪个hello.go文件?

除非我缺少基本的东西,否则这似乎很疯狂 - 所有完全独立的项目都需要共享相同的包和bin目录。 这意味着您不知道哪些包的哪些版本以及哪个exe文件属于哪个项目,而且可能存在大量冲突的余地。 我希望每个单独的go应用程序都有一个/src,/pkg和/bin(像java或grails甚至C),并且gopath是完全多余的,它可以相对于当前项目根目录(像在grails中一样)。

更棘手的是,为了工作,我们必须使用不同的目录,例如:

d:\work\project3
       \project4
       \package5
           \go_utility6
           \go_utility7

现在我们有6个不同的目录用于存放go程序。每次切换到不同的项目时更改路径是不可行的。另一个选择是将这6个路径添加到GOPATH中。假设所有7个go项目都写入相同的pkg和bin目录,那将会是一场灾难。

对于这种情况(至少在Windows上),是否有可行的解决方案?

如果我们需要为每个项目添加GOPATH路径,那么每个项目的文件结构应该是什么样子的?

例如,在xxx\go_utility6下,它是一个独立的命令行go应用程序,它的结构应该是什么?里面需要有src目录吗?这个目录需要gopath指向吗?它需要自己的pkg目录,还是应该使用c:\users\me\pkg目录?


1
请参考如何编写Go代码了解有关代码组织和工作区的基础知识。听起来您想要多个工作区。 - Charlie Tumahai
我有一个问题...你能在同一个Windows系统中安装两个完全相同版本的PhosoShop吗?你能在同一个Windows系统中安装两个Visual Studio 2015吗?现在回答你的问题...go build的输出是一个单一的二进制文件。将它放在任何你想要的地方,然后像执行普通程序一样执行它即可。 - Nidhin David
1
@NidhinDavid 有趣的比喻,但作为Java背景的人,我们习惯于拥有任意数量的库版本而不会出现问题。现在正试图理解Go的工作原理。事实上,我们确实需要多个版本的库,包括生产和开发版本。不断切换它们不是一个选项,因此只是试图找到最好的工作方法。 - John Little
Go非常支持向后兼容性。如果你的库是向后兼容的,那么任何人升级都不会有问题,因此不需要版本号。如果不向后兼容,则Go建议使用新的存储库 - http://zduck.com/2014/go-and-package-versioning/ 顺便说一句,我不是Go专家,只是说出了我听到的。 - Nidhin David
@NidhinDavid 你误解了开发和可执行文件之间的区别,特别是当项目非常庞大或者你在多个由不同公司拥有的项目上工作时,混合它们的源代码并不是一个合适的答案。我使用的是Goland IDE,它允许你设置工作区级别的GOPATH,但这显然不一定是这个问题的答案。 - Ash
3个回答

5

更新: 当我发布这篇文章时,Go语言还没有模块支持,我们构建并使用了一个名为vg的工具。如今,推荐的方法是使用Go模块。

我使用vg来实现这一点,它会处理每个项目的单独GOPATH路径,并在你cd到一个项目时自动切换。


1
使用Go 1.11,引入了Go模块。您可以使用Go模块在GOPATH目录之外管理Go项目。
这里是一个使用Go模块配置项目的示例(链接)

1

你的例子 "which hello.exe" 并没有太多意义。两个同名工具?即使它们都是某种api,你的 devops 也会更喜欢有更有意义的名称。

bin 文件夹用于安装第三方工具,您不必安装项目二进制文件。除非它们是工具,但是那么名称应该再次有意义。

您可以在此处获取有关项目结构的更多信息:https://golang.org/doc/code.html

自从 go 1.8 支持项目文件夹下的 vendor 文件夹以来,可以打破原始结构。(在 1.8 之前,供应商是不可维护的,是的,那很疯狂)

您可能想使用像 direnv 这样的工具,它将支持您每个项目更改 GOPATH 的愿望。 https://github.com/direnv/direnv

它还具有一些内置功能,可以将当前路径添加到GOPATH中。 https://github.com/direnv/direnv/blob/master/stdlib.sh#L355:1 例如,GoLang还支持处理多个GOPATH和每个项目的GOPATH。因此,direnv应该也能正常工作。
在我的公司中,我们在其他项目旁边有一个go文件夹。 在go / src下是我们的项目。到目前为止还没有问题,因为供应商在项目的供应商文件夹中并被提交了。
到目前为止,我推荐的最佳依赖项管理器是: https://github.com/golang/dep 希望这些信息有所帮助。

不幸的是,direnv 只支持 Linux,不支持 Windows。 - John Little
它有许多操作系统的二进制文件。请在Github项目页面上留意发布的版本。还有一些预编译的Windows二进制文件。 - nulldog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接