6

来自 java 和 grails 背景,(并且在 30 年前编写了数百万行 C 语言),我看不出如何在 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 应用程序(如 java 或 grails 甚至 C)都有一个 /src、/pkg 和 /bin,而 go 路径是完全多余的,它可以相对于当前项目根目录(如 grails 中)。

为了使事情奏效,对于工作,我们必须使用不同的目录,例如

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

所以现在我们总共有 6 个单独的目录来存放 go 程序。每次切换到处理不同的项目时都更改路径是不可行的。我猜另一个选择是将 6 条路径添加到 GOPATH。据推测,所有 7 个 go 项目都写入相同的 pkg 和 bin 目录,这将是一场灾难。

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

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

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

4

3 回答 3

5

更新:当我发布这个 Go 没有模块支持时,我们构建并使用了一个名为vg. 如今,推荐的方式是使用 go 模块。

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

于 2018-02-08T15:37:50.060 回答
2

您应该诚实使用的示例“which hello.exe”没有多大意义。两个同名工具?即使两者都是,比方说,一个api,你的 devops 会更喜欢更有意义的名字。

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

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

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

我希望输入有所帮助。

于 2018-01-30T22:59:51.413 回答
1

Go 1.11 引入了 Go 模块。您可以使用 Go Modules 在 GOPATH 目录之外创建 Go 项目。

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

于 2020-08-15T01:25:07.977 回答