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

时间:2018-01-30 21:49:50

标签: go gopath

来自java和Grails的背景,(并且30年前已经写了数百万行C),我不知道如何在Windows上使用固定的gopath。

安装go创建此结构

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

由于你想要有许多项目,它们似乎必须在同一个src / kpg / bin目录中混合在一起,相互污染。 e.g。

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

hello.exe会运行哪个hello.go?

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

为使事情有效,对于工作,我们必须使用不同的方法,例如

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

所以现在我们总共有6个单独的目录,其中有直播的目录。每次切换到处理不同项目时都不可能更改路径。我想另一种选择是将6条路径添加到GOPATH。据推测,所有7个项目都写入相同的pkg和bin目录,这将是一场灾难。

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

如果我们需要为每个项目添加一个PATH到GOPATH,那么每个项目下的文件结构应该是什么?

E.g。 uner xxx \ go_utility6,这是一个独立的命令行go app,该结构应该是什么?那里某处需要有一个src目录吗?这个dir需要gopath指向吗?它需要自己的pkg,还是应该使用c:\​​ users \ me \ pkg目录?

3 个答案:

答案 0 :(得分:2)

您的示例“哪个hello.exe”应该诚实地使用没有多大意义。有两个同名工具? 即使两者都是一个 api ,你的devops也会因为更有意义的名字而感到高兴。

bin文件夹用于您安装的第三方工具,因此您无需安装项目二进制文件。除了它们是工具,但这个名称应该再次有意义。

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

由于go 1.8支持项目文件夹下的供应商文件夹,因此可以破坏原始结构。 (imho供应商在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

我希望输入有所帮助。

答案 1 :(得分:2)

我使用vg,它负责为每个项目保留单独的GOPATH路径,并在cd项目时自动切换。

答案 2 :(得分:1)

在Go 1.11中引入了Go模块。您可以使用Go模块将Go项目放在GOPATH目录之外。

Here是如何使用GoModules配置项目的示例。