Golang导入路径最佳实践

时间:2017-09-20 03:22:26

标签: go import

我目前正在使用Golang进行私人项目(我是新手)。

但我遇到的问题是,我不知道为本地软件包定义import path的正确方法是什么。

我与此链接中的作者有同样的感受https://medium.com/@c9s/golang-the-annoying-remote-import-path-c6c7e76517e5

简而言之,如果我在Github中托管项目foo。使用github.com/levin/foo作为导入路径而不仅仅是foo,我感到很奇怪。如果我将代码移动到Bitbucket或在AWS中托管我自己的git服务器,它会不会造成太多的返工?

更糟糕的是,我可以重写我的代码以更改导入路径,但人们如何使用我的代码通知更改回购?我觉得让别人更新他们的代码是没有意义的。

我是Golang的新手,所以请随便说出像#34这样的问题;你的问题甚至没有效果"。

3 个答案:

答案 0 :(得分:8)

你的问题的答案:

  

我不知道为本地软件包定义导入路径的正确方法是什么。

正如@JimB所说:

  

如果您想使用Go工具,则需要遵循约定。如果你想去上班,那么你需要用全名导入它,否则把它放在GOPATH的任何地方

因此,如果您希望github.com/levin/foo正常工作,则需要使用完整的导入路径go get,如果您希望其他人使用您的包,您应该这样做。

第二个问题的答案:

  

如果我将代码移到Bitbucket或在AWS中托管我自己的git服务器,它不会导致太多的返工吗?

有一种方法可以使用自定义域名作为导入路径,并且仍然可以在任何地方托管您的代码,我认为它被称为虚荣导入路径。您只需要在您使用的导入文件中为html文件添加一些元标记。

This文章解释了如何执行此操作,但总的来说,在访问自定义导入路径时在自定义域中提供的文件中,您需要添加go-import元标记,指向您托管代码的位置。本文使用github.com/foo/bar作为您托管代码的位置示例,并使用foo.com/bar作为真正的导入路径。

因此,在访问foo.com/bar时收到的文件中应该有一个这样的元标记:

<meta name="go-import" content="golang.org/x/tools git http://github.com/foo/bar">

您继续在github中托管您的代码。然后,如果您将托管位置更改为代码,则只需更改元标记的值,但使用该包的所有代码将继续使用完全相同的导入路径"foo.com/bar

唯一的问题是现在您的项目可以通过2个不同的路径导入:foo.com/bargithub.com/foo/bar。为了解决这个问题,他们有canonical imports只允许使用自定义路径而不是github导入包,它只在每个包文件的包名旁边添加注释:

package bar // import "foo.com/bar"

这是避免此问题的唯一方法。如果您正在使用仅在本地使用的包,则可以使用@srxf answer只知道go工具不能使用该代码(如go get)。如果您希望代码按预期工作,那么这就是您的选择。

作为评论,我知道对本地软件包导入github.com/levin/foo感觉很愚蠢,但如果您在另一个软件包中使用该软件包(比如foo2)而其他人导入foo2,这允许编译器确切地知道获取foo2的依赖项的位置,因为代码中的所有导入都包括整个路由,而不是本地文件的名称。通过这种方式,人们可以随时获得包所需的依赖关系,而无需在回购中包含这些文件,也无需为其配置任何内容。这不是完美的,但它是可行的方式,他们称之为约定优于配置或类似的东西。

答案 1 :(得分:0)

我们也正在开发一个项目(私下),我们在GitLab上托管它,我很清楚go get在私有存储库上不能很好地工作(至少据我所知)。

我们所做的是创建了一个文件夹,让我们说$GOPATH/src/theproject并克隆该文件夹中的所有存储库。

到目前为止,它对我们来说效果很好,但您可能也认为这样做很乏味,而且确实如此,但我们没有其他任何方法可以做到这一点。我们使用git pull手动更新代码。

答案 2 :(得分:0)

从Go 1.11开始,随着Go模块的引入,应该可以重新回答这个问题。模块可用于解决此“本地路径”难题以及GOPATH范围之外的讨厌项目。 您现在可以通过...初始化项目了。

go mod init <main package name>

然后您可以通过本地软件包的软件包名称来引用它们。 这样...

go mod init app

然后(假设您有另一个名为“模型”的本地程序包)参考文件

import (
  "app/models"
)

参考:

https://github.com/golang/go/wiki/Modules

Accessing local packages within a go module (go 1.11)

相关问题