【问题标题】:how to manage GOPATH for multiple project directories如何管理多个项目目录的 GOPATH
【发布时间】:2018-01-30 21:49:50
【问题描述】:

来自 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 目录?

【问题讨论】:

  • 参见How to Write Go Code 了解代码组织和工作区的基础知识。听起来您想要多个工作区。
  • 我有一个问题...你能在同一个 Windows 中安装两个完全相同版本的 PhosoShop 吗?你可以在同一个 Windows 中安装两个 Visual Studio 2015 吗?现在回答您的问题...go build 的输出是单个二进制文件。将其放置在您想要的任何位置,然后像执行普通程序一样执行它
  • @NidhinDavid 有趣的类比,但是来自 java 背景,我们习惯于拥有任意数量的任何库版本而不会出现问题。试图掌握 go 的工作原理。实际上,我们确实需要多个版本的库,即生产版本和开发版本。不断切换它们不是一种选择,所以只是试图找到最好的工作方式。
  • Go 是向后兼容的忠实拥护者。如果您的库是,那么任何人升级都一定没有问题..因此不需要版本。如果不向后兼容,那么 Go 推荐一个新的存储库 - zduck.com/2014/go-and-package-versioning BTW 我不是 Go 专家..只是说我听到的,仅此而已。
  • @NidhinDavid 您误认为使用可执行文件进行开发,尤其是当项目很大或者您在不同公司拥有的多个项目上工作时,混合其源代码不是一个合适的答案。我使用了 Goland 和 IDE,它允许您设置工作区级别 GOPATH,但这显然不一定是这个问题的答案。

标签: go gopath


【解决方案1】:

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

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

【讨论】:

    【解决方案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

    我希望输入有所帮助。

    【讨论】:

    • 很遗憾,direnv 只是 linux,不支持 windows。
    • 它有许多操作系统的二进制文件。在 github 项目页面上留意发布。有一些预构建的 Windows 二进制文件。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-02-14
      • 2016-11-05
      • 1970-01-01
      • 1970-01-01
      • 2021-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      相关资源
      最近更新 更多