我目前正在使用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这样的问题;你的问题甚至没有效果"。
答案 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/bar
和github.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"
)
参考: