Golang导入路径最佳实践

Lev*_*ong 7 import go

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

但我有一个问题,我不知道什么是定义import path本地包的正确方法.

我和这个链接的作者有同样的感觉https://medium.com/@c9s/golang-the-annoying-remote-import-path-c6c7e76517e5

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

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

我是Golang的新手,所以请随便说出"你的问题甚至无效".

Top*_*opo 9

你的问题的答案:

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

正如@JimB所说:

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

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

你的第二个问题的答案:

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

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

文章解释了如何做到这一点,但总的看来,在得到您的自定义域提供当访问自定义导入路径的文件中,你需要添加一个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">
Run Code Online (Sandbox Code Playgroud)

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

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

package bar // import "foo.com/bar"
Run Code Online (Sandbox Code Playgroud)

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

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